Nếu bạn muốn khóa bảng trong một hàng đã chọn cụ thể, bạn cần phải LOCK FIRST
họ sử dụng FOR UPDATE / FOR SHARE
Ví dụ:trong trường hợp của bạn, nếu bạn cần khóa hàng đầu tiên, bạn thực hiện điều này:
BEGIN;
LOCK TABLE person IN ROW EXCLUSIVE MODE;
-- BLOCK 1
SELECT * FROM person WHERE name = 'John' and money = 1 FOR UPDATE;
-- BLOCK 2
UPDATE person set name = 'John 2' WHERE name = 'John' and money = 1;
END;
Trong BLOCK1
trước SELECT
tuyên bố bạn không làm gì chỉ nói với cơ sở dữ liệu "Này, tôi sẽ làm một cái gì đó trong bảng này, vì vậy khi tôi làm, hãy khóa bảng này ở chế độ này". Bạn có thể chọn / cập nhật / xóa bất kỳ hàng nào.
Nhưng trong BLOCK2
khi bạn sử dụng FOR UPDATE
bạn khóa hàng đó với các giao dịch khác ở các chế độ cụ thể (đọc doc để biết thêm chi tiết). Sẽ bị khóa cho đến khi giao dịch đó kết thúc.
Nếu bạn cần một ví dụ, hãy làm một bài kiểm tra và cố gắng thực hiện một SELECT ... FOR UPDATE
khác trong BLOCK2
trước khi kết thúc giao dịch đầu tiên. Nó sẽ đợi giao dịch đầu tiên kết thúc và sẽ chọn ngay sau đó.
Tôi đang sử dụng nó trong một chức năng để kiểm soát các chuỗi con và nó thật tuyệt. Hy vọng bạn sẽ thích.