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

Làm cách nào để khóa hàng InnoDB chưa tồn tại?

Mặc dù câu trả lời ở trên là đúng trong đó CHỌN ... CHO CẬP NHẬT sẽ ngăn các phiên / giao dịch đồng thời chèn cùng một bản ghi, nhưng đó không phải là sự thật đầy đủ. Tôi hiện đang đấu tranh với cùng một vấn đề và đã đi đến kết luận rằng CHỌN ... CHO CẬP NHẬT gần như vô dụng trong tình huống đó vì lý do sau:

Một giao dịch / phiên đồng thời cũng có thể thực hiện LỰA CHỌN ... CHO CẬP NHẬT trên cùng một giá trị bản ghi / chỉ mục và MySQL sẽ vui vẻ chấp nhận điều đó ngay lập tức (không chặn) và không có lỗi. Tất nhiên, ngay sau khi phiên khác làm điều đó, phiên của bạn cũng không thể chèn bản ghi nữa. Bạn cũng như phiên / giao dịch khác cũng không nhận được bất kỳ thông tin nào về tình huống và nghĩ rằng họ có thể chèn hồ sơ một cách an toàn cho đến khi họ thực sự cố gắng làm như vậy. Việc cố gắng chèn sau đó dẫn đến bế tắc hoặc lỗi trùng lặp khóa, tùy thuộc vào trường hợp.

Nói cách khác, CHỌN ... CHO CẬP NHẬT ngăn các phiên khác chèn (các) bản ghi tương ứng, NHƯNG ngay cả khi bạn thực hiện CHỌN ... CHO CẬP NHẬT và bản ghi tương ứng không được tìm thấy, rất có thể bạn không thể thực sự chèn bản ghi đó. IMHO, làm cho phương thức "truy vấn đầu tiên, sau đó chèn" vô dụng.

Nguyên nhân của vấn đề là do MySQL không cung cấp bất kỳ phương pháp nào để thực sự khóa các bản ghi không tồn tại. Hai phiên / giao dịch đồng thời có thể khóa các bản ghi không tồn tại "FOR UPDATE" cùng một lúc, một điều thực sự không thể xảy ra và điều này làm cho việc phát triển trở nên khó khăn hơn đáng kể.

Cách duy nhất để giải quyết vấn đề này dường như là sử dụng bảng semaphore hoặc khóa toàn bộ bảng khi chèn. Vui lòng tham khảo tài liệu MySQL để tham khảo thêm về cách khóa toàn bộ bảng hoặc sử dụng bảng semaphore.

Chỉ 2 xu của tôi ...



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Chỉ mục (dựa trên không) phải lớn hơn hoặc bằng 0

  2. truy vấn mysql của một ngày, giữa hai trường ngày

  3. Tại sao find_in_set hoạt động nhưng mệnh đề IN

  4. Cách lưu trữ giá trị trống dưới dạng Trường số nguyên

  5. Bắt hàng trước và sau một truy vấn