Below two-sessions-trying-to-update-the-same-row scenario was provided by Paul White.
Scenario 1:
- Session 1 obtains a
U
lock on the base table row while reading.- Session 2 blocks, waiting to acquire
U
on the same row in the base table.- Session 1 sets Value to 10 and commits.
- Session 2 acquires its
U
lock and finds nothing to do, since Value != 0 now.Outcome: Value is set to 10.
Based on Paul, session 2 has already located the row that it needs to update, but it got blocked. When the blocking is gone and session 2 got its U lock, it needs to check the condition again? Am I understanding it right? To me it's kind of weird. The session has located this row, it's because it evaluated the filter which leads to the identification of this row. Why it needs to check the condition again before actual update?