Mysql
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> Mysql

Xử lý cơ sở dữ liệu DBI với AutoCommit được đặt thành 0 không trả về dữ liệu thích hợp với SELECT?

Tôi cho rằng bạn đang sử dụng bảng InnoDB chứ không phải bảng MyISAM. Như được mô tả trong InnoDB mô hình giao dịch , tất cả các truy vấn của bạn (bao gồm cả CHỌN) đang diễn ra bên trong một giao dịch.

Khi AutoCommit đang bật, một giao dịch được bắt đầu cho mỗi truy vấn và nếu nó thành công, nó được cam kết ngầm (nếu nó không thành công, hành vi có thể khác nhau, nhưng giao dịch được đảm bảo kết thúc). Bạn có thể thấy các cam kết ngầm trong binlog của MySQL. Bằng cách đặt AutoCommit thành false, bạn bắt buộc phải tự quản lý các giao dịch.

Mức cô lập giao dịch mặc định là CÓ THỂ LẶP LẠI ĐỌC , có nghĩa là tất cả SELECT các truy vấn sẽ đọc cùng một ảnh chụp nhanh (ảnh được thiết lập khi giao dịch bắt đầu).

Ngoài giải pháp được đưa ra trong câu trả lời khác (ROLLBACK trước khi bắt đầu đọc) đây là một số giải pháp:

Bạn có thể chọn một mức cách ly giao dịch khác, chẳng hạn như ĐỌC ĐƯỢC CAM KẾT , điều này làm cho SELECT của bạn truy vấn đọc ảnh chụp nhanh mới mọi lúc.

Bạn cũng có thể để lại AutoCommit thành true (cài đặt mặc định) và bắt đầu giao dịch của riêng bạn bằng cách phát hành BEGIN WORK . Điều này sẽ tạm thời vô hiệu hóa AutoCommit hành vi cho đến khi bạn phát hành một COMMIT hoặc ROLLBACK sau đó mỗi truy vấn nhận lại giao dịch của chính nó (hoặc bạn bắt đầu một giao dịch khác với BEGIN WORK ).

Cá nhân tôi, sẽ chọn phương pháp thứ hai, vì nó có vẻ thanh lịch hơn.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Tìm kiếm FULLTEXT trong MySQL không trả về bất kỳ hàng nào

  2. thủ tục trong mysql

  3. PDOException "không thể tìm thấy trình điều khiển" trong php

  4. Ràng buộc duy nhất kiểm tra hai cột trong MySQL

  5. MySQL ALTER TABLE trên bảng rất lớn - có an toàn để chạy nó không?