Giao dịch trong thủ tục lưu sẵn mysql

Một thủ tục được lưu trữ trong MySQL hoạt động như một phương thức được lưu trữ trong cơ sở dữ liệu. Nó có tên và chấp nhận một tập hợp các đối số và có thể được gọi thông qua câu lệnh

1
2
3
4
5
8. Trong bài đăng này, chúng tôi sẽ xem xét cách chúng tôi có thể xác định thủ tục được lưu trữ, cách các tham số và biến hoạt động và cuối cùng là cách chúng tôi có thể xác định các giao dịch và xử lý các ngoại lệ tương ứng

  • Tạo thủ tục lưu trữ
  • Thông số
  • Biến
  • Giao dịch

Tạo thủ tục lưu trữ

Các thủ tục được lưu trữ trong MySQL có định dạng sau

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
DELIMITER //

CREATE PROCEDURE insertcustomer (
    pFirstName VARCHAR(255), 
    pLastName  VARCHAR(255), 
    pAge       INT
)

BEGIN

    INSERT INTO Customer 
    (
        FirstName, 
        LastName, 
        Age
    ) 
    VALUES 
    (
        pFirstName, 
        pLastName, 
        pAge
    );

END //

DELIMITER ;

1
2
3
4
5
9 theo sau với tên thủ tục và các tham số của nó. Phần thân của thủ tục được xác định trong câu lệnh ghép bắt đầu bằng
CREATE PROCEDURE `mysproc`(IN pValue INT)

BEGIN
    SET pValue = 10;
END
0 và kết thúc bằng
CREATE PROCEDURE `mysproc`(IN pValue INT)

BEGIN
    SET pValue = 10;
END
1. Một câu lệnh ghép cho phép chúng ta chỉ định nhiều câu lệnh sẽ được thực hiện theo thứ tự. Sau này chúng ta sẽ xem làm thế nào chúng ta có thể đảm bảo tính nguyên tử của thay đổi bằng cách sử dụng một giao dịch

Bởi vì chúng ta thêm thủ tục lưu sẵn bằng cách thực thi câu lệnh SQL, nên chúng ta phải thay đổi dấu phân cách, ban đầu là

CREATE PROCEDURE `mysproc`(IN pValue INT)

BEGIN
    SET pValue = 10;
END
2 thành một thứ khác, ví dụ ở đây là
CREATE PROCEDURE `mysproc`(IN pValue INT)

BEGIN
    SET pValue = 10;
END
3 để các câu lệnh trong
CREATE PROCEDURE `mysproc`(IN pValue INT)

BEGIN
    SET pValue = 10;
END
4 có thể có dấu phân cách phù hợp. Cuối cùng, chúng tôi đặt lại dấu phân cách thành
CREATE PROCEDURE `mysproc`(IN pValue INT)

BEGIN
    SET pValue = 10;
END
2

Thông số

Các tham số có thể được cung cấp cho một thủ tục, ví dụ

1
2
3
4
5
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
1

Các tham số bắt đầu bằng chế độ tham số tùy chọn

CREATE PROCEDURE `mysproc`(IN pValue INT)

BEGIN
    SET pValue = 10;
END
6 trong đó
CREATE PROCEDURE `mysproc`(IN pValue INT)

BEGIN
    SET pValue = 10;
END
7 chỉ định đầu vào giá trị. Đầu vào giá trị được sao chép trước khi vào quy trình, nếu tham số được sửa đổi trong quy trình, nó sẽ không được phản ánh ở phía người gọi. Ví dụ với thủ tục được lưu trữ sau

1
2
3
4
5
CREATE PROCEDURE `mysproc`(IN pValue INT)

BEGIN
    SET pValue = 10;
END

Nếu chúng ta gọi

CREATE PROCEDURE `mysproc`(IN pValue INT)

BEGIN
    SET pValue = 10;
END
8

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
7____18

Lựa chọn của

CREATE PROCEDURE `mysproc`(IN pValue INT)

BEGIN
    SET pValue = 10;
END
9 sẽ vẫn trả về
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
70. Trái ngược với
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
71 chỉ định tham số
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
71

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
7____18

CREATE PROCEDURE `mysproc`(IN pValue INT)

BEGIN
    SET pValue = 10;
END
9 ở đây sẽ là
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
74. Tham số
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
71 có giá trị là
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
76 khi nhập thủ tục được lưu trữ

Cuối cùng,

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
77 chỉ định một tham số nhận giá trị của nó được chuyển bởi người gọi và cho phép thủ tục được lưu trữ sửa đổi nó

1
2
3
4
5
DELIMITER //

CREATE PROCEDURE insertcustomer (
    pFirstName VARCHAR(255), 
    pLastName  VARCHAR(255), 
    pAge       INT
)

BEGIN

    INSERT INTO Customer 
    (
        FirstName, 
        LastName, 
        Age
    ) 
    VALUES 
    (
        pFirstName, 
        pLastName, 
        pAge
    );

END //

DELIMITER ;
1

Sau đó gọi bằng

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
74

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
7____23

sẽ đặt

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
79 trên
CREATE PROCEDURE `mysproc`(IN pValue INT)

BEGIN
    SET pValue = 10;
END
9

CREATE PROCEDURE `mysproc`(IN pValue INT)

BEGIN
    SET pValue = 10;
END
7 được sử dụng làm mặc định khi chế độ tham số không được cung cấp

Biến

Trong ví dụ trước của chúng tôi khi gọi thủ tục được lưu trữ, chúng tôi đã sử dụng các biến do người dùng xác định với

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
82. Đối với thủ tục lưu sẵn, chúng ta có thể sử dụng
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
83 để khai báo các biến cục bộ. Chúng phải được xác định ở đầu trước, bất kỳ câu lệnh nào khác

DELIMITER //

CREATE PROCEDURE insertcustomer (
    pFirstName VARCHAR(255), 
    pLastName  VARCHAR(255), 
    pAge       INT
)

BEGIN

    INSERT INTO Customer 
    (
        FirstName, 
        LastName, 
        Age
    ) 
    VALUES 
    (
        pFirstName, 
        pLastName, 
        pAge
    );

END //

DELIMITER ;
4
DELIMITER //

CREATE PROCEDURE insertcustomer (
    pFirstName VARCHAR(255), 
    pLastName  VARCHAR(255), 
    pAge       INT
)

BEGIN

    INSERT INTO Customer 
    (
        FirstName, 
        LastName, 
        Age
    ) 
    VALUES 
    (
        pFirstName, 
        pLastName, 
        pAge
    );

END //

DELIMITER ;
5

Ví dụ ở đây, chúng tôi thực hiện hai lần chèn, lần chèn đầu tiên thêm khách hàng, trong khi lần chèn thứ hai chèn vào bảng địa chỉ. Lúc đầu, chúng tôi khai báo một biến cục bộ

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
84, sau đó chúng tôi đặt thành
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
85 để sử dụng nó trong lần chèn tiếp theo

Giá trị mặc định cũng có thể được thêm vào với

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
86 chẳng hạn như
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
87

Giao dịch

Chúng tôi thấy rằng một thủ tục được lưu trữ có thể bao gồm nhiều câu lệnh (e. g.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
88,
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
89,
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
70,
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
71). Trong ví dụ trước của chúng tôi, nơi chúng tôi chèn khách hàng sau đó chèn địa chỉ, nếu xảy ra lỗi khi chèn địa chỉ, khách hàng sẽ vẫn được chèn. Để duy trì tính nguyên tử của hoạt động, chúng ta có thể sử dụng một giao dịch

Chúng tôi có thể xác định một giao dịch với

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
72 và sử dụng
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
73 hoặc
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
74

DELIMITER //

CREATE PROCEDURE insertcustomer (
    pFirstName VARCHAR(255), 
    pLastName  VARCHAR(255), 
    pAge       INT
)

BEGIN

    INSERT INTO Customer 
    (
        FirstName, 
        LastName, 
        Age
    ) 
    VALUES 
    (
        pFirstName, 
        pLastName, 
        pAge
    );

END //

DELIMITER ;
6
DELIMITER //

CREATE PROCEDURE insertcustomer (
    pFirstName VARCHAR(255), 
    pLastName  VARCHAR(255), 
    pAge       INT
)

BEGIN

    INSERT INTO Customer 
    (
        FirstName, 
        LastName, 
        Age
    ) 
    VALUES 
    (
        pFirstName, 
        pLastName, 
        pAge
    );

END //

DELIMITER ;
7

Chúng tôi bắt đầu giao dịch và hoàn thành giao dịch với

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
73 hoặc
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
74

Lưu ý rằng nếu chúng ta quên kết thúc giao dịch, sẽ có một giao dịch mở sau khi gọi thủ tục được lưu trữ. Ví dụ: nếu chúng tôi bắt đầu một giao dịch trong một thủ tục và không bao giờ hoàn thành nó

DELIMITER //

CREATE PROCEDURE insertcustomer (
    pFirstName VARCHAR(255), 
    pLastName  VARCHAR(255), 
    pAge       INT
)

BEGIN

    INSERT INTO Customer 
    (
        FirstName, 
        LastName, 
        Age
    ) 
    VALUES 
    (
        pFirstName, 
        pLastName, 
        pAge
    );

END //

DELIMITER ;
8
DELIMITER //

CREATE PROCEDURE insertcustomer (
    pFirstName VARCHAR(255), 
    pLastName  VARCHAR(255), 
    pAge       INT
)

BEGIN

    INSERT INTO Customer 
    (
        FirstName, 
        LastName, 
        Age
    ) 
    VALUES 
    (
        pFirstName, 
        pLastName, 
        pAge
    );

END //

DELIMITER ;
9

Sẽ có một giao dịch được mở mà chúng ta có thể thấy bằng cách gọi bảng giao dịch

1
2
3
4
5
0
1
2
3
4
5
1

Điều này rất quan trọng vì bất kỳ

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
74 nào sau lệnh gọi của thủ tục sẽ khôi phục các thay đổi được thực hiện bên trong thủ tục này. Vì vậy, để hoàn thành một giao dịch, chúng tôi phải xử lý cả
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
73 và
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
74

Đối với

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
74, chúng tôi xác định trình xử lý thoát bằng cách sử dụng
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
81 được sử dụng để thoát khỏi thủ tục được lưu trữ

_______03

Bên trong trình xử lý, chúng tôi

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
74 giao dịch và sử dụng
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
83 để ném lại ngoại lệ. Nếu chúng tôi bỏ qua để từ chức ngoại lệ, thủ tục được lưu trữ sẽ trở lại thành công

Và điều đó kết thúc bài viết ngày hôm nay

Sự kết luận

Trong bài viết hôm nay, chúng ta đã xem xét cách tạo thủ tục lưu sẵn trong MySQL. Chúng tôi đã bắt đầu bằng cách xem cách quy trình được lưu trữ được định nghĩa bằng một ví dụ, sau đó chúng tôi chuyển sang xem cách các tham số được truyền vào một quy trình được lưu trữ và cách chúng tôi cũng có thể sử dụng các biến cục bộ bên trong một quy trình được lưu trữ. Và chúng tôi đã hoàn thành bài viết bằng cách xem xét các giao dịch. Tôi hy vọng bạn thích bài đăng này và hẹn gặp lại bạn ở bài tiếp theo

Chúng tôi có thể sử dụng giao dịch trong thủ tục được lưu trữ không?

Có, thủ tục được lưu trữ có thể chạy bên trong giao dịch .

Ví dụ về giao dịch trong MySQL là gì?

Một giao dịch là một nhóm tuần tự các hoạt động thao tác cơ sở dữ liệu, được thực hiện như thể nó là một đơn vị công việc duy nhất . Nói cách khác, một giao dịch sẽ không bao giờ hoàn thành trừ khi từng hoạt động riêng lẻ trong nhóm thành công.

Các giao dịch được xử lý trong MySQL như thế nào?

Một giao dịch trong MySQL bắt đầu với câu lệnh SQL thực thi đầu tiên và kết thúc khi tìm thấy một cam kết hoặc được khôi phục rõ ràng hoặc ngầm định . Nó sử dụng rõ ràng câu lệnh COMMIT hoặc ROLLBACK và ngầm định khi sử dụng câu lệnh DDL.

Chúng ta có thể sử dụng thủ tục được lưu trữ trong MySQL không?

Trong thực tế, các hàm được lưu trữ có xu hướng sử dụng các câu lệnh ghép, trừ khi phần thân bao gồm một câu lệnh RETURN duy nhất. MySQL cho phép các thường trình chứa các câu lệnh DDL, chẳng hạn như CREATE và DROP. MySQL cũng cho phép các thủ tục được lưu trữ (chứ không phải các hàm được lưu trữ) chứa các câu lệnh giao dịch SQL như CAM KẾT .