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

Mysql chọn để cập nhật - nó không khóa các hàng đích. Làm thế nào để tôi chắc chắn rằng nó không?

A SELECT FOR UPDATE khóa hàng bạn đã chọn để cập nhật cho đến khi giao dịch bạn tạo kết thúc. Các giao dịch khác chỉ có thể đọc hàng đó nhưng chúng không thể cập nhật hàng miễn là giao dịch chọn để cập nhật vẫn mở.

Để khóa (các) hàng:

START TRANSACTION;
SELECT * FROM test WHERE id = 4 FOR UPDATE;
# Run whatever logic you want to do
COMMIT;

Giao dịch ở trên sẽ vẫn tồn tại và sẽ khóa hàng cho đến khi giao dịch được cam kết.

Để kiểm tra nó, có nhiều cách khác nhau. Tôi đã thử nghiệm nó bằng cách sử dụng hai phiên bản đầu cuối với máy khách MySQL được mở trong mỗi phiên bản.

Trên first terminal bạn chạy SQL:

START TRANSACTION;
SELECT * FROM test WHERE id = 4 FOR UPDATE;
# Do not COMMIT to keep the transaction alive

Trên second terminal bạn có thể thử cập nhật hàng:

UPDATE test SET parent = 100 WHERE id = 4;

Vì bạn tạo một lựa chọn để cập nhật trên first terminal truy vấn ở trên sẽ đợi cho đến khi giao dịch chọn để cập nhật được cam kết hoặc nó sẽ hết thời gian chờ.

Quay lại first terminal và thực hiện giao dịch:

COMMIT;

Kiểm tra second terminal và bạn sẽ thấy rằng truy vấn cập nhật đã được thực thi (nếu nó không hết thời gian chờ).




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. MySQL:So sánh GIỮA thời gian

  2. Có đúng về mặt khái niệm khi thực hiện SELECT MAX (id), v.v. để tìm hàng được chèn cuối cùng không?

  3. Cài đặt và cấu hình MySQL trên Ubuntu 20.04

  4. Làm thế nào để giảm phân vùng mà không làm giảm dữ liệu trong MySQL?

  5. Có thể sử dụng lệnh LOAD DATA INFILE để CẬP NHẬT các hàng trong db không?