Trong mẫu mã bạn đã cung cấp, tất cả các lần đọc của hàng đó sẽ thấy giá trị cũ cho đến khi giao dịch đó được thực hiện.
1) Xem xét mẫu mã được chạy hai lần đồng thời, với cùng giá trị là X
. Nếu cá thể A đã chạy select ... for update
thì nó đã khóa hàng đó cho đến khi nó bắt đầu. Trường hợp B, làm tương tự, sẽ ngăn chặn việc cố gắng khóa theo cùng một cách. Chỉ khi A cam kết, B mới có thể tiếp tục. B sau đó sẽ nhận được giá trị A bị bỏ lại trong bản cập nhật cuối cùng của nó.
Nếu Y
phụ thuộc vào giá trị mà select ... for update
truy vấn đọc hoặc giá trị khác của truy vấn trong phần 'phức tạp', thì điều này sẽ có tác dụng tương tự như khi chúng được chạy một cách an toàn - bạn không nhận được điều kiện cuộc đua trong đó một trong các kết quả sẽ là bỏ đi.
Nếu Y
hoàn toàn là kết quả của các truy vấn phức tạp ở giữa, thì việc chạy song song mà không có select ... for update
cả hai sẽ thực hiện cùng một bản cập nhật.
2) for share
sẽ cho phép các lựa chọn khác trên hàng đó được tiến hành, nhưng sẽ khiến mọi thứ khác cố gắng select ... for update
hoặc update ...
chặn cho đến khi hoàn thành. Nếu mã mẫu được chạy hai lần, đồng thời, chúng sẽ bế tắc trong việc tiếp cận update
câu lệnh, khiến một trong số chúng bị hủy bỏ.
3) Không. Làm điều này rất nguy hiểm, vì người đọc có thể đọc một trường được cập nhật một nửa. (Hoặc đọc phần còn lại của một trường được cập nhật sau khi bắt đầu đọc.) Nó cũng có thể phá vỡ tính nhất quán, hiển thị cho người đọc một giá trị được cập nhật sau khi bắt đầu giao dịch.