Рассмотрим две параллельные транзакции SQL:
X = 0
T1: | T2:
begin | begin
set serializable level | set serializable level
|
WRITE(X,1)
| READ(X) : 0
COMMIT |
| COMMIT
Я тестировал его с PosgreSQL.
Почему T2
фиксирует правильно? Обе транзакции имеют сериализуемый уровень. Итак, на мой взгляд, послеT2
была запущена строка X
изменена. Итак, T2:COMMIT
должен потерпеть неудачу. Почему это не так?
In effect, a SELECT query sees a snapshot of the database as of the instant the query begins to run. Source
Запрос SELECT будет работать только с этим моментальным снимком. Но другие виды запросов ведут себя так, как вы ожидаете.
UPDATE, DELETE, SELECT FOR UPDATE, and SELECT FOR SHARE . . . will wait for the first updating transaction to commit or roll back (if it is still in progress). Source (ibid)
Вы можете проверить это поведение, например, запустив два сеанса psql. Запустите оператор UPDATE в одном сеансе и SELECT...FOR UPDATE в другом.