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 BEGIN
và COMMIT
.)
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 autocommit
cà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 TRANSACTION
rõ 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 BEGIN
hoặc START TRANSACTION
rõ 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.)