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.