Các INSERT có được tự động cam kết không?


13

Ứng dụng của chúng tôi thực hiện một truy vấn INSERT vào Cơ sở dữ liệu MySQL để thêm các bản ghi. Tôi muốn biết liệu các hồ sơ có được tự động cam kết hay không. Nếu tôi chạy lệnh ROLLBACK, khi nào cơ sở dữ liệu thực hiện khôi phục? Là một ROLLBACK có thể sau khi CAM KẾT?


Để làm rõ, tôi đã gắn thẻ là 'innodb' cách đây 19 giờ, vì InnoDB sử dụng CAM KẾT / ROLLBACK.
RolandoMySQLDBA

Điều này được +1 để nhắc nhở các Nhà phát triển và DBA chú ý đến hành vi giao dịch, các mô hình ứng dụng sửa lỗi hỗ trợ các giao dịch và hậu quả của nó (tốt hoặc xấu).
RolandoMySQLDBA

Tôi đã trả lời câu hỏi của bạn với một bình luận dưới câu trả lời của tôi.
RolandoMySQLDBA

Câu trả lời:


10

Câu trả lời cho câu hỏi của bạn phụ thuộc vào việc bạn có trong giao dịch sẽ trải qua nhiều hơn một tuyên bố hay không. (Bạn đã gắn thẻ câu hỏi với InnoDB, câu trả lời sẽ khác với MyISAM.)

Từ hướng dẫn tham khảo: http://dev.mysql.com/doc/refman/5.1/en/commit.html

Theo mặc định, MySQL chạy với chế độ tự động kích hoạt. Điều này có nghĩa là ngay khi bạn thực hiện một câu lệnh cập nhật (sửa đổi) bảng, MySQL sẽ lưu bản cập nhật trên đĩa để làm cho nó vĩnh viễn.

Vì vậy, theo mặc định, nếu bạn chỉ đang sử dụng INSERT, các bản ghi bạn chèn sẽ được cam kết và không có điểm nào cố gắng khôi phục chúng. (Điều này thực sự giống như gói từng câu giữa BEGINCOMMIT.)

Tuy nhiên, nếu bạn đang xử lý các giao dịch một cách rõ ràng, bạn sẽ phải sử dụng COMMITđể cam kết lưu trữ hồ sơ, nhưng bạn cũng sẽ có thể sử dụng ROLLBACK.

Bạn có thể bắt đầu một giao dịch rõ ràng bằng cách sử dụng START TRANSACTION(hoặc BEGIN). Điều này độc lập với autocommitcài đặt (theo mặc định):

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 CAMIT hoặc ROLLBACK. Chế độ autocommit sau đó trở lại trạng thái trước đó.

Ngoài ra, nếu autocommit=0, tôi nghĩ rằng bất kỳ tuyên bố nào sau khi kết thúc giao dịch khác, sẽ bắt đầu một giao dịch (nhưng bạn vẫn có thể sử dụng START TRANSACTIONrõ ràng); ít nhất đó là cách tôi diễn giải điều này :

Chế độ tự động. Nếu được đặt thành 1, tất cả các thay đổi đối với bảng sẽ có hiệu lực ngay lập tức. Nếu được đặt thành 0, bạn phải sử dụng CAM KẾT để chấp nhận giao dịch hoặc ROLLBACK để hủy giao dịch. Nếu autocommit là 0 và bạn thay đổi thành 1, MySQL thực hiện CAM KẾT tự động của bất kỳ giao dịch mở nào. Một cách khác để bắt đầu giao dịch là sử dụng câu lệnh START TRANSACTION hoặc BEGIN. Xem Phần 12.3.1, GIAO DỊCH BẮT ĐẦU, CAM KẾT, và Cú pháp ROLLBACK Cú pháp.

Cụ thể hơn "cách khác để bắt đầu giao dịch" dường như ngụ ý rằng cài đặt "autocommit = 0" là đủ để bắt đầu giao dịch (ít nhất là ngay trước mỗi tuyên bố khi bắt đầu phiên hoặc theo sau COMMIT/ ROLLBACK). Tôi sẽ đề nghị sử dụng BEGINhoặc START TRANSACTIONrõ ràng bằng mọi cách ngay cả khi autocommit=0, vì nó có thể làm cho nó rõ ràng hơn để xem khi giao dịch bắt đầu hoặc kết thúc.

(Cách bạn bắt đầu giao dịch có thể phụ thuộc vào cách ứng dụng của bạn sử dụng MySQL.)


1
Xứng đáng là +1 để xác định đầy đủ các giao thức giao dịch.
RolandoMySQLDBA

@Bruno, Đối với MyISAM khi "cam kết" và "khôi phục" không hoạt động, liệu các phần chèn có được cam kết một nửa không?
Pacerier

7

Theo mặc định, InnoDB được đặt thành autocommit = 1 hoặc ON . Một khi đã cam kết, họ không thể quay trở lại .

Bạn sẽ phải làm một trong hai điều để vô hiệu hóa nó về phía trước:

TÙY CHỌN 1: Thêm phần này vào /etc/my.cnf và khởi động lại mysql

[mysqld]
autocommit=0

TÙY CHỌN 2: Thực hiện một trong những điều này trong Khởi tạo DB mở trước khi bắt đầu bất kỳ SQL có ý nghĩa nào

SET autocommit = 0;
START TRANSACTION;

Trong hai tùy chọn này, bạn sẽ phải thực hiện CAM KẾT thủ công hoặc ROLLBACK thủ công .

CAUPAT

Nếu bảng là MyISAM, thì việc giải thích đơn giản hơn. Vì không có giao dịch nào cho công cụ lưu trữ MyISAM, nên tất cả các CHERTN, CẬP NHẬT và XÓA được thực hiện là vĩnh viễn. Không có rollback gì.


Để làm rõ thêm, câu trả lời của tôi giải quyết cả hai công cụ lưu trữ InnoDB và MyISAM.
RolandoMySQLDBA

1
Chỉ trong trường hợp Auto Commit TẮT trong InnoDB và ứng dụng của tôi đang thực hiện Chèn Truy vấn và tôi quên thực thi Cam kết, mất bao lâu để thay đổi?
RPK

Nếu ứng dụng của bạn thực hiện thủ công một CAMIT sau mỗi INSERT, nó sẽ được viết và không thể xóa. Nếu Kết nối DB chết trước khi bạn CAM KẾT, tất cả các thay đổi sẽ bị mất và khôi phục xảy ra. Nếu bạn thực hiện bất kỳ DDL nào (CREATE TABLE, DROP TABLE, ALTER TABLE, v.v.) hoặc phát hành khóa bảng theo cách thủ công, các INSERT sẽ tự động được kích hoạt. Nếu bạn sử dụng START TRANSACTION, tất cả các thay đổi không được cam kết sẽ được cam kết.
RolandoMySQLDBA

1
Về "Nếu bạn sử dụng BẮT ĐẦU GIAO DỊCH, tất cả các thay đổi không được cam kết sẽ được cam kết." (trong bối cảnh DDL, nếu không, nó sẽ được khôi phục), trước đó cũng có một cam kết ngầm (cam kết ngầm sau là từ phiên bản 5.5.3 theo tài liệu).
Bruno

1
"Nếu bạn sử dụng START TRANSACTION, tất cả các thay đổi không được cam kết sẽ được cam kết." . . giao dịch mới ".
RolandoMySQLDBA
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.