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

MySQL Select ... để cập nhật với chỉ mục có vấn đề về đồng thời

Từ quan điểm lý thuyết thuần túy, có vẻ như bạn đang không khóa đúng hàng (điều kiện trong câu lệnh đầu tiên khác với trong câu lệnh cập nhật; ngoài ra bạn chỉ khóa một hàng vì LIMIT 1 , trong khi bạn có thể cập nhật nhiều hàng hơn sau này).

Hãy thử điều này:

START TRANSACTION;
SELECT v_id FROM v_ext WHERE username IS NULL AND v_id=yyy FOR UPDATE;
UPDATE v_ext SET username=xxx WHERE v_id=yyy;
COMMIT;

[sửa]

Đối với lý do bế tắc của bạn, đây là câu trả lời có thể xảy ra ( từ hướng dẫn sử dụng ):

Không có chỉ mục, SELECT ... FOR UPDATE câu lệnh có khả năng khóa toàn bộ bảng, trong khi với một chỉ mục, nó chỉ khóa một số hàng. Bởi vì bạn không khóa các hàng bên phải trong câu lệnh đầu tiên, một khóa bổ sung được nhận trong câu lệnh thứ hai.

Rõ ràng là không thể xảy ra bế tắc nếu toàn bộ bảng bị khóa (tức là không có chỉ mục). Một bế tắc chắc chắn có thể xảy ra trong lần thiết lập thứ hai.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. hằng số chưa khởi tạo Mysql2 ::Client ::SECURE_CONNECTION

  2. Nhận tất cả người dùng ngoại trừ người dùng đã đăng nhập hiện tại trong laravel hùng hồn

  3. Chèn truy vấn con trong Chọn truy vấn

  4. Làm cách nào để cập nhật nhiều bảng bằng một truy vấn mysql?

  5. MySQL:lỗi 150 khi sử dụng ON UPDATE SET NULL và ON DELETE SET NULL, tại sao?