Optimistic — check at commit. Pessimistic — lock during operation.
Optimistic Locking:
Optimistic:
READ: SELECT * FROM accounts WHERE id=1 (version=5)
UPDATE: SET balance=200, version=6 WHERE id=1 AND version=5
If version changed → retry
Pessimistic Locking:
Pessimistic:
SELECT * FROM accounts WHERE id=1 FOR UPDATE
(Other transactions wait)
UPDATE SET balance=200 WHERE id=1
COMMIT (release lock)
Key differences: