13.3.1 & nbsp; bắt đầu các câu lệnh giao dịch, cam kết và rollback
START TRANSACTION
[transaction_characteristic [, transaction_characteristic] ...]
transaction_characteristic: {
WITH CONSISTENT SNAPSHOT
| READ WRITE
| READ ONLY
}
BEGIN [WORK]
COMMIT [WORK] [AND [NO] CHAIN] [[NO] RELEASE]
ROLLBACK [WORK] [AND [NO] CHAIN] [[NO] RELEASE]
SET autocommit = {0 | 1}
Các tuyên bố này cung cấp quyền kiểm soát việc sử dụng các giao dịch:
START TRANSACTION
hoặcBEGIN
Bắt đầu một giao dịch mới.COMMIT
thực hiện giao dịch hiện tại, làm cho các thay đổi của nó vĩnh viễn.ROLLBACK
quay lại giao dịch hiện tại, hủy bỏ các thay đổi của nó.SET autocommit
vô hiệu hóa hoặc cho phép chế độ AutoCommit mặc định cho phiên hiện tại.
Theo mặc định, MySQL chạy với chế độ AutoCommit được bật. Điều này có nghĩa là, khi không có trong một giao dịch, mỗi câu lệnh là nguyên tử, như thể nó được bao quanh bởi START
TRANSACTION
và COMMIT
. Bạn không thể sử dụng ROLLBACK
để hoàn tác hiệu ứng; Tuy nhiên, nếu xảy ra lỗi trong quá trình thực thi tuyên bố, câu lệnh sẽ được quay lại.
Để vô hiệu hóa chế độ AutoCommit ngầm cho một loạt các câu lệnh, hãy sử dụng câu lệnh START TRANSACTION
:
START TRANSACTION;
SELECT @A:=SUM[salary] FROM table1 WHERE type=1;
UPDATE table2 SET summary=@A WHERE type=1;
COMMIT;
Với START TRANSACTION
, AutoCommit vẫn bị vô hiệu hóa cho đến khi bạn kết thúc giao dịch với COMMIT
hoặc ROLLBACK
. Chế độ AutoCommit sau đó trở lại trạng thái trước đó.
START TRANSACTION
cho phép một số sửa đổi kiểm soát các đặc điểm giao dịch. Để chỉ định nhiều công cụ sửa đổi, hãy tách chúng bằng dấu phẩy.
Công cụ sửa đổi
6 bắt đầu một lần đọc nhất quán cho các công cụ lưu trữ có khả năng của nó. Điều này chỉ áp dụng choSTART TRANSACTION; SELECT @A:=SUM[salary] FROM table1 WHERE type=1; UPDATE table2 SET summary=@A WHERE type=1; COMMIT;
7. Hiệu ứng này giống như phát hànhSTART TRANSACTION; SELECT @A:=SUM[salary] FROM table1 WHERE type=1; UPDATE table2 SET summary=@A WHERE type=1; COMMIT;
START TRANSACTION
, sau đó là
9 từ bất kỳ bảngSTART TRANSACTION; SELECT @A:=SUM[salary] FROM table1 WHERE type=1; UPDATE table2 SET summary=@A WHERE type=1; COMMIT;
7 nào. Xem Phần & NBSP; 15.7.2.3, không khóa nhất định đọc. Công cụ sửa đổiSTART TRANSACTION; SELECT @A:=SUM[salary] FROM table1 WHERE type=1; UPDATE table2 SET summary=@A WHERE type=1; COMMIT;
1 không thay đổi mức cách ly giao dịch hiện tại, do đó, nó chỉ cung cấp một ảnh chụp nhanh nhất quán nếu mức cách ly hiện tại là một cấp độ cho phép đọc nhất quán. Mức cách cô lập duy nhất cho phép đọc nhất quán làSET autocommit=0;
2. Đối với tất cả các cấp độ cô lập khác, mệnh đềSET autocommit=0;
3 bị bỏ qua. Một cảnh báo được tạo ra khi mệnh đềSET autocommit=0;
6 bị bỏ qua.START TRANSACTION; SELECT @A:=SUM[salary] FROM table1 WHERE type=1; UPDATE table2 SET summary=@A WHERE type=1; COMMIT;
Bộ điều chỉnh
5 vàSET autocommit=0;
6 đặt chế độ truy cập giao dịch. Họ cho phép hoặc cấm thay đổi các bảng được sử dụng trong giao dịch. Hạn chếSET autocommit=0;
7 ngăn giao dịch sửa đổi hoặc khóa cả bảng giao dịch và không chuyển giao có thể hiển thị cho các giao dịch khác; Giao dịch vẫn có thể sửa đổi hoặc khóa các bảng tạm thời.SET autocommit=0;
MySQL cho phép tối ưu hóa thêm cho các truy vấn trên bảng
7 khi giao dịch được biết là chỉ đọc. Chỉ địnhSTART TRANSACTION; SELECT @A:=SUM[salary] FROM table1 WHERE type=1; UPDATE table2 SET summary=@A WHERE type=1; COMMIT;
7 đảm bảo các tối ưu hóa này được áp dụng trong trường hợp trạng thái chỉ đọc không thể được xác định tự động. Xem Phần & NBSP; 8.5.3, Tối ưu hóa các giao dịch chỉ đọc của InnoDB để biết thêm thông tin.SET autocommit=0;
Nếu không có chế độ truy cập được chỉ định, chế độ mặc định áp dụng. Trừ khi mặc định đã được thay đổi, nó được đọc/ghi. Nó không được phép chỉ định cả
5 vàSET autocommit=0;
7 trong cùng một tuyên bố.SET autocommit=0;
Trong chế độ chỉ đọc, vẫn có thể thay đổi các bảng được tạo bằng từ khóa
START TRANSACTION
2 bằng cách sử dụng các câu lệnh DML. Những thay đổi được thực hiện với các câu lệnh DDL không được phép, giống như với các bảng vĩnh viễn.Để biết thêm thông tin về chế độ truy cập giao dịch, bao gồm các cách để thay đổi chế độ mặc định, hãy xem Phần & NBSP; 13.3.7, Câu lệnh giao dịch Set Set.
Nếu biến hệ thống
START TRANSACTION
3 được bật, hãy bắt đầu rõ ràng một giao dịch vớiSTART TRANSACTION
4 yêu cầu đặc quyềnSTART TRANSACTION
5 [hoặc đặc quyềnSTART TRANSACTION
6 không dùng nữa].
Quan trọng
Nhiều API được sử dụng để viết các ứng dụng máy khách MySQL [như JDBC] cung cấp các phương thức riêng để bắt đầu các giao dịch có thể [và đôi khi nên] được sử dụng thay vì gửi câu lệnh START TRANSACTION
từ máy khách. Xem Chương & NBSP; 29, Trình kết nối và API hoặc tài liệu cho API của bạn, để biết thêm thông tin.
Để vô hiệu hóa chế độ AutoCommit một cách rõ ràng, hãy sử dụng câu lệnh sau:
SET autocommit=0;
Sau khi vô hiệu hóa chế độ AutoCommit bằng cách đặt biến START TRANSACTION
8 thành 0, các thay đổi đối với các bảng an toàn giao dịch [chẳng hạn như cho các bảng cho
START TRANSACTION;
SELECT @A:=SUM[salary] FROM table1 WHERE type=1;
UPDATE table2 SET summary=@A WHERE type=1;
COMMIT;
7 hoặc BEGIN
0] không được thực hiện vĩnh viễn ngay lập tức. Bạn phải sử dụng COMMIT
để lưu trữ các thay đổi của mình vào đĩa hoặc ROLLBACK
để bỏ qua các thay đổi. START TRANSACTION
8 là một biến phiên và phải được đặt cho mỗi phiên. Để vô hiệu hóa chế độ AutoCommit cho mỗi kết nối mới, hãy xem mô tả của biến hệ thống START TRANSACTION
8 tại Phần & NBSP; 5.1.8, các biến hệ thống máy chủ của Hồi giáo.
BEGIN
và BEGIN
6 được hỗ trợ dưới dạng bí danh của START TRANSACTION
để bắt đầu giao dịch. START TRANSACTION
là cú pháp SQL tiêu chuẩn, là cách được khuyến nghị để bắt đầu giao dịch đặc biệt và cho phép các công cụ sửa đổi mà BEGIN
không có.
Tuyên bố BEGIN
khác với việc sử dụng từ khóa BEGIN
bắt đầu một câu lệnh ghép COMMIT
2. Cái sau không bắt đầu một giao dịch. Xem Phần & NBSP; 13.6.1, Bắt đầu ... Kết thúc Tuyên bố hợp chất.
Ghi chú
Trong tất cả các chương trình được lưu trữ [các quy trình và chức năng được lưu trữ, kích hoạt và sự kiện], trình phân tích cú pháp coi COMMIT
3 là khởi đầu của khối COMMIT
4. Thay vào đó, hãy bắt đầu một giao dịch trong bối cảnh này với COMMIT
5.
Từ khóa COMMIT
6 tùy chọn được hỗ trợ cho COMMIT
và ROLLBACK
, cũng như các điều khoản COMMIT
9 và ROLLBACK
0. COMMIT
9 và ROLLBACK
0 có thể được sử dụng để kiểm soát bổ sung đối với việc hoàn thành giao dịch. Giá trị của biến hệ thống ROLLBACK
3 xác định hành vi hoàn thành mặc định. Xem Phần & NBSP; 5.1.8, Biến hệ thống máy chủ của Cameron.
Điều khoản ROLLBACK
4 khiến một giao dịch mới bắt đầu ngay khi giao dịch hiện tại kết thúc và giao dịch mới có cùng mức cách ly như giao dịch được chấm dứt. Giao dịch mới cũng sử dụng cùng một chế độ truy cập [ROLLBACK
5 hoặc
SET autocommit=0;
7] làm giao dịch được chấm dứt. Điều khoản ROLLBACK
0 khiến máy chủ ngắt kết nối phiên máy khách hiện tại sau khi chấm dứt giao dịch hiện tại. Bao gồm từ khóa ROLLBACK
8 triệt tiêu hoàn thành COMMIT
9 hoặc ROLLBACK
0, có thể hữu ích nếu biến hệ thống ROLLBACK
3 được đặt để gây ra chuỗi hoặc giải phóng hoàn thành theo mặc định.Bắt đầu một giao dịch gây ra bất kỳ giao dịch đang chờ xử lý. Xem Phần & NBSP; 13.3.3, Các câu lệnh gây ra một cam kết ngầm, để biết thêm thông tin.
Bắt đầu một giao dịch cũng khiến các khóa bảng có được với SET autocommit
2 được phát hành, như thể bạn đã thực thi SET autocommit
3. Bắt đầu một giao dịch không phát hành khóa đọc toàn cầu có được với SET autocommit
4.
Để có kết quả tốt nhất, các giao dịch nên được thực hiện chỉ bằng các bảng được quản lý bởi một công cụ lưu trữ an toàn giao dịch. Nếu không, các vấn đề sau đây có thể xảy ra:
Nếu bạn sử dụng các bảng từ nhiều hơn một công cụ lưu trữ an toàn giao dịch [chẳng hạn như
7] và mức cách ly giao dịch không phải làSTART TRANSACTION; SELECT @A:=SUM[salary] FROM table1 WHERE type=1; UPDATE table2 SET summary=@A WHERE type=1; COMMIT;
SET autocommit
6, có thể khi một giao dịch thực hiện, một giao dịch đang diễn ra khác sử dụng cùng một bảng những thay đổi được thực hiện bởi giao dịch đầu tiên. Đó là, tính nguyên tử của các giao dịch không được đảm bảo với các động cơ hỗn hợp và sự không nhất quán có thể dẫn đến. .Nếu bạn sử dụng các bảng không an toàn giao dịch trong giao dịch, các thay đổi cho các bảng đó được lưu trữ cùng một lúc, bất kể trạng thái của chế độ AutoCommit.
Nếu bạn đưa ra tuyên bố
ROLLBACK
sau khi cập nhật bảng không chuyển hóa trong giao dịch, thì cảnh báoSTART TRANSACTION
0 sẽ xảy ra. Các thay đổi đối với các bảng an toàn giao dịch được quay lại, nhưng không thay đổi đối với các bảng không an toàn.
Mỗi giao dịch được lưu trữ trong nhật ký nhị phân trong một đoạn, vào COMMIT
. Các giao dịch được quay lại không được ghi lại. . Phần & NBSP; 5.4.4, Nhật ký nhị phân.Exception: Modifications to nontransactional tables cannot be rolled back. If a transaction that is rolled
back includes modifications to nontransactional tables, the entire transaction is logged with a ROLLBACK
statement at the end to ensure that modifications to the nontransactional tables are replicated.] See Section 5.4.4, “The Binary
Log”.
Bạn có thể thay đổi mức độ cô lập hoặc chế độ truy cập cho các giao dịch với câu lệnh START
TRANSACTION
3. Xem Phần & NBSP; 13.3.7, SET SET Tuyên bố giao dịch.
Lấy lại có thể là một hoạt động chậm có thể xảy ra ngầm mà không có người dùng yêu cầu rõ ràng [ví dụ: khi xảy ra lỗi]. Do đó, START
TRANSACTION
4 hiển thị START
TRANSACTION
5 trong cột START
TRANSACTION
6 cho phiên, không chỉ đối với các cuộc chạy lại rõ ràng được thực hiện với câu lệnh ROLLBACK
mà còn cho các cuộc chạy lại ngầm.
Khi
START TRANSACTION;
SELECT @A:=SUM[salary] FROM table1 WHERE type=1;
UPDATE table2 SET summary=@A WHERE type=1;
COMMIT;
7 thực hiện một cuộc quay đầu hoàn chỉnh của một giao dịch, tất cả các khóa được đặt bởi giao dịch được phát hành. Nếu một câu lệnh SQL duy nhất trong giao dịch quay lại do lỗi, chẳng hạn như lỗi khóa trùng lặp, khóa được đặt bởi câu lệnh được bảo tồn trong khi giao dịch vẫn hoạt động. Điều này xảy ra bởi vì START TRANSACTION;
SELECT @A:=SUM[salary] FROM table1 WHERE type=1;
UPDATE table2 SET summary=@A WHERE type=1;
COMMIT;
7 lưu trữ khóa hàng ở định dạng sao cho không thể biết sau đó khóa nào được đặt bởi câu lệnh nào.Nếu câu lệnh
START TRANSACTION;
SELECT @A:=SUM[salary] FROM table1 WHERE type=1;
UPDATE table2 SET summary=@A WHERE type=1;
COMMIT;
9 trong giao dịch gọi hàm được lưu trữ và một câu lệnh trong hàm được lưu trữ không thành công, câu lệnh đó sẽ quay lại. Nếu ROLLBACK
được thực thi cho giao dịch sau đó, toàn bộ giao dịch sẽ quay lại.