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

MySQL select for update trả về tập hợp trống mặc dù tồn tại một hàng

Từ sự phụ thuộc vào việc đặt giá trị của cột được lập chỉ mục cao hơn hoặc thấp hơn, có vẻ như khóa thực sự đang được đặt trên mục nhập chỉ mục. Công cụ cơ sở dữ liệu quét chỉ mục và dừng lại ở mục nhập bị khóa đầu tiên, chờ nó được phát hành.

Khi giao dịch đầu tiên được cam kết, chỉ mục sẽ được mở khóa và giao dịch đang chờ tiếp tục quét chỉ mục. Bởi vì giá trị đã bị hạ thấp, nó hiện có trong chỉ mục sớm hơn. Vì vậy, quá trình quét được tiếp tục sẽ không nhìn thấy nó vì nó đã vượt qua thời điểm đó.

Để xác nhận điều này, hãy thử kiểm tra sau:

  1. Tạo hai hàng, với các giá trị 2 và 3.
  2. Trong cả hai giao dịch, hãy thực hiện SELECT ... FOR UPDATE
  3. Trong giao dịch 1, hãy thay đổi 2 thành 1, 3 thành 4.
  4. Giao dịch cam kết 1.

Nếu suy đoán của tôi là đúng, giao dịch 2 sẽ chỉ trả về hàng có 4.

Điều này có vẻ như là một lỗi đối với tôi, vì tôi không nghĩ rằng bạn sẽ nhận được kết quả từng phần như thế này. Thật không may, rất khó để tìm kiếm điều này tại bug.mysql.com, vì từ "for" bị bỏ qua khi tìm kiếm vì nó quá ngắn hoặc phổ biến. Ngay cả trích dẫn "để cập nhật" dường như không tìm thấy lỗi chỉ chứa cụm từ này.




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Kết nối với máy chủ MySQL qua SSH trong PHP

  2. Ứng dụng để thiết kế ngược MySQL &PostgreSQL DB?

  3. MySQL:Sự khác biệt giữa `... ADD INDEX (a); ... THÊM CHỈ SỐ (b); `và` ... THÊM CHỈ SỐ (a, b); `?

  4. Làm cách nào để lưu trữ đơn đặt hàng?

  5. Cách thoát khỏi dấu ngoặc kép trong Doctrine