Khóa hàng (row-level locking) trong MySQL cho phép bạn khóa các hàng cụ thể trong một bảng để ngăn chặn các giao dịch khác truy cập hoặc thay đổi dữ liệu của những hàng đó trong khi giao dịch hiện tại đang thực hiện. Điều này hữu ích khi bạn muốn tăng tính đồng thời và hiệu suất của ứng dụng, đặc biệt trong các tình huống có nhiều người dùng truy cập cùng một bảng.
Để thực hiện khóa hàng trong MySQL, bạn có thể sử dụng các câu lệnh SQL như SELECT ... FOR UPDATE
hoặc SELECT ... LOCK IN SHARE MODE
.
SELECT ... FOR UPDATE
Câu lệnh này sẽ khóa các hàng được chọn cho đến khi giao dịch hoàn tất (commit hoặc rollback). Các giao dịch khác sẽ không thể sửa đổi các hàng này cho đến khi giao dịch đầu tiên hoàn tất.
Cú pháp:
START TRANSACTION; SELECT * FROM ten_bang WHERE điều_kiện FOR UPDATE; -- Thực hiện các cập nhật hoặc thay đổi cần thiết COMMIT; -- hoặc ROLLBACK;
Ví dụ:
START TRANSACTION; SELECT * FROM khach_hang WHERE id = 1 FOR UPDATE; -- Giả sử bạn muốn cập nhật email của khách hàng UPDATE khach_hang SET email = '[email protected]' WHERE id = 1; COMMIT;
SELECT ... LOCK IN SHARE MODE
Câu lệnh này cũng khóa các hàng được chọn, nhưng cho phép các giao dịch khác có thể đọc (SELECT) các hàng này, nhưng không thể sửa đổi chúng cho đến khi giao dịch hiện tại hoàn tất.
Cú pháp:
START TRANSACTION; SELECT * FROM ten_bang WHERE điều_kiện LOCK IN SHARE MODE; -- Thực hiện các truy vấn cần thiết COMMIT; -- hoặc ROLLBACK;
Ví dụ:
START TRANSACTION; SELECT * FROM khach_hang WHERE id = 1 LOCK IN SHARE MODE; -- Các giao dịch khác có thể đọc dữ liệu, nhưng không thể sửa đổi COMMIT;
START TRANSACTION
và kết thúc bằng COMMIT
hoặc ROLLBACK
.FOR UPDATE
khi bạn cần sửa đổi dữ liệu, và LOCK IN SHARE MODE
khi bạn chỉ cần đọc dữ liệu mà không cần sửa đổi.Bằng cách sử dụng khóa hàng hiệu quả, bạn có thể quản lý các giao dịch trong MySQL một cách an toàn và hiệu quả hơn. Nếu bạn cần thêm thông tin hoặc ví dụ cụ thể hơn, hãy cho tôi biết!