Hướng dẫn is it necessary to commit after insert in mysql? - có cần phải cam kết sau khi chèn vào mysql không?

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

    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 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.

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

    SET autocommit=0;
    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 cho
    SET autocommit=0;
    3. Hiệu ứng này giống như phát hành START TRANSACTION sau đó là
    SET autocommit=0;
    5 từ bất kỳ bảng
    SET 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 đổi
    SET 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.

  • Bộ điều chỉnh INSERT1 và INSERT2 Đặ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ế INSERT3 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

    SET autocommit=0;
    3 khi giao dịch được biết là chỉ đọc. Chỉ định INSERT3 đả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ả INSERT1 và INSERT3 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 INSERT8 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 INSERT9 được bật, rõ ràng bắt đầu giao dịch với INSERT /*+ APPEND */0 yêu cầu đặc quyền INSERT /*+ APPEND */1 (hoặc đặc quyền INSERT /*+ 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à INSERT2 đượ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 INSERT8. 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 INSERT9 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 parallel0 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 parallel1 hoặc INSERT3) 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 parallel4 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 parallel8 được phát hành, như thể bạn đã thực thi ORA-12838: cannot read/modify an object after modifying it in parallel9. 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ư

    SET autocommit=0;
    3) và mức cách ly giao dịch không phải là 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

    START TRANSACTION;
    SELECT @A:=SUM(salary) FROM table1 WHERE type=1;
    UPDATE table2 SET summary=@A WHERE type=1;
    COMMIT;
    2 sau khi cập nhật bảng không chuyển hóa trong giao dịch, cảnh báo 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 TRANSACTION0 hiển thị START TRANSACTION1 trong cột START TRANSACTION2 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.

Cam kết có được yêu cầu trong MySQL không?

Bạn phải sử dụng cam kết để lưu trữ các thay đổi của mình cho đĩa hoặc rollback để bỏ qua các thay đổi. AutoCommit 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 AutoCommit tại Mục 5.1. 8, các biến hệ thống máy chủ trên mạng.. autocommit is a session variable and must be set for each session. To disable autocommit mode for each new connection, see the description of the autocommit system variable at Section 5.1. 8, “Server System Variables”.

Có cần thiết phải sử dụng cam kết trong SQL không?

Một lệnh cam kết trong SQL là một lệnh thiết yếu được sử dụng sau các hoạt động ngôn ngữ thao tác dữ liệu (DML) như chèn, xóa và cập nhật các giao dịch. Giao dịch trong SQL là một tập hợp các câu lệnh SQL. Khi bạn thực hiện thao tác DML mà không có tuyên bố cam kết, các thay đổi chỉ hiển thị cho bạn. that is used after Data Manipulation Language (DML) operations like INSERT, DELETE and UPDATE transactions. Transactions in SQL are a set of SQL statements. When you perform a DML operation without a COMMIT statement, the changes are visible only to you.

Điều gì xảy ra nếu chúng ta không sử dụng cam kết trong SQL?

Miễn là bạn không cam kết hoặc cuộn lại một giao dịch, nó vẫn "chạy" và có khả năng giữ khóa. Nếu khách hàng (ứng dụng hoặc người dùng) của bạn đóng kết nối với cơ sở dữ liệu trước khi cam kết, mọi giao dịch vẫn đang chạy sẽ được quay lại và chấm dứt.it's still "running" and potentially holding locks. If your client (application or user) closes the connection to the database before committing, any still running transactions will be rolled back and terminated.

Cam kết có cần thiết sau khi thả bảng không?

Tạo các câu lệnh bảng và bảng không cam kết giao dịch nếu từ khóa tạm thời được sử dụng.(Điều này không áp dụng cho các hoạt động khác trên các bảng tạm thời như bảng thay đổi và tạo chỉ mục, điều này gây ra cam kết.)do not commit a transaction if the TEMPORARY keyword is used. (This does not apply to other operations on temporary tables such as ALTER TABLE and CREATE INDEX , which do cause a commit.)

Cam kết có cần thiết sau khi chọn không?

Chỉ có một vài tình huống mà tôi có thể nghĩ rằng bạn có thể muốn cam kết sau khi được chọn.Nếu lựa chọn của bạn tham gia trên các liên kết cơ sở dữ liệu, một giao dịch sẽ được tạo.Nếu bạn cố gắng đóng liên kết này, bạn sẽ gặp lỗi trừ khi bạn đã phạm/quay lại giao dịch.if your select is joining on database links, a transaction will be created. if you attempt to close this link, you'd get an error unless you committed/rolled back the transaction.

Cam kết có cần thiết cho DML không?

Hiệu quả của câu lệnh DML không phải là vĩnh viễn cho đến khi bạn thực hiện giao dịch bao gồm nó.Một giao dịch là một chuỗi các câu lệnh SQL mà cơ sở dữ liệu Oracle coi là một đơn vị (nó có thể là một câu lệnh DML duy nhất).Cho đến khi một giao dịch được thực hiện, nó có thể được quay lại (hoàn tác).. A transaction is a sequence of SQL statements that Oracle Database treats as a unit (it can be a single DML statement). Until a transaction is committed, it can be rolled back (undone).