Bạn có thể không muốn cam kết sau mỗi INSERT
, nhưng có lẽ bạn muốn cam kết sau mỗi INSERT /*+ APPEND */
.
Đối với một INSERT
thông thường, có lẽ bạn chỉ muốn cam kết khi giao dịch logic của ứng dụng hoàn tất. Cam kết không cần thiết sau mỗi lần chèn thông thường sẽ gây ra vấn đề về hiệu suất và tính nguyên tử.
Đối với một con đường trực tiếp INSERT /*+ APPEND */
, có lẽ bạn cần phải cam kết càng sớm càng tốt. Đường dẫn trực tiếp viết cải thiện hiệu suất với chi phí khóa thêm [và các vấn đề khác]. Việc khóa thêm khối đó vào mỗi phiên, ngay cả phiên hiện tại, thậm chí là đọc đối tượng cho đến khi giao dịch được thực hiện. Để tránh lỗi ORA-12838: cannot read/modify an object after modifying it in parallel
, thông thường các chương trình phải cam kết sau mỗi INSERT /*+ APPEND */
.
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ặc
0 Bắt đầu một giao dịch mới.START TRANSACTION; SELECT @A:=SUM[salary] FROM table1 WHERE type=1; UPDATE table2 SET summary=@A WHERE type=1; COMMIT;
1 thực hiện giao dịch hiện tại, thực hiện các thay đổi của nó vĩnh viễn.START TRANSACTION; SELECT @A:=SUM[salary] FROM table1 WHERE type=1; UPDATE table2 SET summary=@A WHERE type=1; COMMIT;
2 Quay lại giao dịch hiện tại, hủy bỏ các thay đổi của nó.START TRANSACTION; SELECT @A:=SUM[salary] FROM table1 WHERE type=1; UPDATE table2 SET summary=@A WHERE type=1; COMMIT;
3 vô hiệu hóa hoặc cho phép chế độ AutoCommit mặc định cho phiên hiện tại.START TRANSACTION; SELECT @A:=SUM[salary] FROM table1 WHERE type=1; UPDATE table2 SET summary=@A WHERE type=1; COMMIT;
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;
SELECT @A:=SUM[salary] FROM table1 WHERE type=1;
UPDATE table2 SET summary=@A WHERE type=1;
COMMIT;
4 và START TRANSACTION;
SELECT @A:=SUM[salary] FROM table1 WHERE type=1;
UPDATE table2 SET summary=@A WHERE type=1;
COMMIT;
1. Bạn không thể sử dụng START TRANSACTION;
SELECT @A:=SUM[salary] FROM table1 WHERE type=1;
UPDATE table2 SET summary=@A WHERE type=1;
COMMIT;
2 để 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
START TRANSACTION;
SELECT @A:=SUM[salary] FROM table1 WHERE type=1;
UPDATE table2 SET summary=@A WHERE type=1;
COMMIT;
1 hoặc START TRANSACTION;
SELECT @A:=SUM[salary] FROM table1 WHERE type=1;
UPDATE table2 SET summary=@A WHERE type=1;
COMMIT;
2. 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
2 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 choSET autocommit=0;
3. Hiệu ứng này giống như phát hànhSET autocommit=0;
START TRANSACTION
sau đó là
5 từ bất kỳ bảngSET autocommit=0;
3 nào. Xem Phần & NBSP; 15.7.2.3, không khóa nhất định đọc. Công cụ sửa đổiSET autocommit=0;
7 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;
8. Đối với tất cả các cấp độ cô lập khác, mệnh đềSET autocommit=0;
9 bị bỏ qua. Một cảnh báo được tạo ra khi mệnh đềSET autocommit=0;
2 bị bỏ qua.SET autocommit=0;
Bộ điều chỉnh
INSERT
1 vàINSERT
2 Đặ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ếINSERT
3 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ể nhìn thấy đối với 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.MySQL cho phép tối ưu hóa thêm cho các truy vấn trên bảng
3 khi giao dịch được biết là chỉ đọc. Chỉ địnhSET autocommit=0;
INSERT
3 đả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.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ả
INSERT
1 vàINSERT
3 trong cùng một tuyên bố.Trong chế độ chỉ đọc, vẫn có thể thay đổi các bảng được tạo bằng từ khóa
INSERT
8 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
INSERT
9 được bật, rõ ràng bắt đầu giao dịch vớiINSERT /*+ APPEND */
0 yêu cầu đặc quyềnINSERT /*+ APPEND */
1 [hoặc đặc quyềnINSERT /*+ APPEND */
2 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 INSERT /*+ APPEND */
4 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ư các bảng cho
SET autocommit=0;
3 hoặc INSERT /*+ APPEND */
6] không được tạo vĩnh viễn ngay lập tức. Bạn phải sử dụng START TRANSACTION;
SELECT @A:=SUM[salary] FROM table1 WHERE type=1;
UPDATE table2 SET summary=@A WHERE type=1;
COMMIT;
1 để lưu trữ các thay đổi của mình vào đĩa hoặc START TRANSACTION;
SELECT @A:=SUM[salary] FROM table1 WHERE type=1;
UPDATE table2 SET summary=@A WHERE type=1;
COMMIT;
2 để bỏ qua các thay đổi. INSERT /*+ APPEND */
4 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 INSERT /*+ APPEND */
4 tại Phần & NBSP; 5.1.8, các biến hệ thống máy chủ của Hồi giáo.
START TRANSACTION;
SELECT @A:=SUM[salary] FROM table1 WHERE type=1;
UPDATE table2 SET summary=@A WHERE type=1;
COMMIT;
0 và INSERT
2 đượ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à START TRANSACTION;
SELECT @A:=SUM[salary] FROM table1 WHERE type=1;
UPDATE table2 SET summary=@A WHERE type=1;
COMMIT;
0 không có.Câu lệnh
START TRANSACTION;
SELECT @A:=SUM[salary] FROM table1 WHERE type=1;
UPDATE table2 SET summary=@A WHERE type=1;
COMMIT;
0 khác với việc sử dụng từ khóa START TRANSACTION;
SELECT @A:=SUM[salary] FROM table1 WHERE type=1;
UPDATE table2 SET summary=@A WHERE type=1;
COMMIT;
0 bắt đầu một câu lệnh ghép INSERT
8. 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 INSERT
9 là khởi đầu của khối INSERT /*+ APPEND */
0. Thay vào đó, hãy bắt đầu một giao dịch trong bối cảnh này với INSERT /*+ APPEND */
1.
Từ khóa INSERT /*+ APPEND */
2 tùy chọn được hỗ trợ cho
START TRANSACTION;
SELECT @A:=SUM[salary] FROM table1 WHERE type=1;
UPDATE table2 SET summary=@A WHERE type=1;
COMMIT;
1 và START TRANSACTION;
SELECT @A:=SUM[salary] FROM table1 WHERE type=1;
UPDATE table2 SET summary=@A WHERE type=1;
COMMIT;
2, cũng như các điều khoản INSERT /*+ APPEND */
5 và INSERT /*+ APPEND */
6. INSERT /*+ APPEND */
5 và INSERT /*+ APPEND */
6 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 INSERT /*+ APPEND */
9 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 ORA-12838: cannot read/modify an object after modifying it in parallel
0 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 [ORA-12838: cannot read/modify an object after modifying it in parallel
1 hoặc INSERT
3] làm giao dịch được chấm dứt. Điều khoản INSERT /*+ APPEND */
6 khiến máy chủ ngắt kết nối phiên 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 ORA-12838: cannot read/modify an object after modifying it in parallel
4 triệt tiêu hoàn thành INSERT /*+ APPEND */
5 hoặc INSERT /*+ APPEND */
6, có thể hữu ích nếu biến hệ thống INSERT /*+ APPEND */
9 đượ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 ORA-12838: cannot read/modify an object after modifying it in parallel
8 được phát hành, như thể bạn đã thực thi ORA-12838: cannot read/modify an object after modifying it in parallel
9. 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 INSERT /*+ APPEND */
0.
Để 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ư
3] và mức cách ly giao dịch không phải làSET autocommit=0;
INSERT /*+ APPEND */
2, 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 câu lệnh
2 sau khi cập nhật bảng không chuyển hóa trong giao dịch, cảnh báoSTART TRANSACTION; SELECT @A:=SUM[salary] FROM table1 WHERE type=1; UPDATE table2 SET summary=@A WHERE type=1; COMMIT;
INSERT /*+ APPEND */
6 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
START TRANSACTION;
SELECT @A:=SUM[salary] FROM table1 WHERE type=1;
UPDATE table2 SET summary=@A WHERE type=1;
COMMIT;
1. 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 START TRANSACTION;
SELECT @A:=SUM[salary] FROM table1 WHERE type=1;
UPDATE table2 SET summary=@A WHERE type=1;
COMMIT;
2 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 INSERT /*+ APPEND */
9. 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
0 hiển thị START TRANSACTION
1 trong cột START TRANSACTION
2 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
START TRANSACTION;
SELECT @A:=SUM[salary] FROM table1 WHERE type=1;
UPDATE table2 SET summary=@A WHERE type=1;
COMMIT;
2 mà còn cho các cuộc chạy lại ngầm.Khi
SET autocommit=0;
3 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ì SET autocommit=0;
3 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
SET autocommit=0;
5 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 START TRANSACTION;
SELECT @A:=SUM[salary] FROM table1 WHERE type=1;
UPDATE table2 SET summary=@A WHERE type=1;
COMMIT;
2 được thực hiện cho giao dịch sau đó, toàn bộ giao dịch sẽ quay lại.