Одновременные обновления в Oracle: блокировка или нет? - PullRequest
6 голосов
/ 23 сентября 2011

Я в замешательстве. Я читаю о MVCC в Oracle. Я думал, что MVCC означает отсутствие замков. Но я читал где-то еще, что все UPDATE делают автоматическую блокировку, независимо от уровня изоляции. Может кто-нибудь объяснить, что происходит во время обновления Oracle? И что происходит, когда несколько транзакций, считывающих чтение, пытаются выполнить одновременное update t set c = c + 1 where id = 3. Каков результат, учитывая c = 1 перед любой из транзакций, и что происходит с блокировками и SCN?

Begin T1
Begin T2
T1:  update t set c = c + 1 where id = 3
T2:  update t set c = c + 1 where id = 3
Commit T1
Commit T2

1 Ответ

8 голосов
/ 23 сентября 2011

Вы правы, это заблокирует ряд независимо от уровня изоляции. С помощью MVCC вы можете получать согласованные чтения без блокировок, но вам все равно нужны блокировки при записи.

Вторая транзакция будет ожидать завершения первой (например, COMMIT или ROLLBACK), прежде чем попытаться что-либо сделать. Таким образом, в этом случае курсор на T2 будет «зависать» при обновлении, ожидая завершения T1.

Вы получите новый SCN после фиксации T1 и еще один после фиксации T2.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...