Чтение полной фиксации моментального снимка: откат конфликта обновления отображается как тупик?

Я прочитал зафиксированный снимок изоляции и разрешить изоляцию ON для моей базы данных. Я все еще получаю ошибку взаимоблокировки. Я уверен, что знаю, что происходит...

  1. Первая транзакция получает порядковый номер в начале своей транзакции.
  2. Второй получает более поздний порядковый номер в начале своей транзакции, но после того, как первая транзакция уже получила его (второй порядковый номер более поздний, чем первый).
  3. Вторая транзакция сначала попадает в оператор обновления. Когда он проверяет версию строки, он видит запись, которая предшествует обеим транзакциям, поскольку первая еще не достигла обновления. Он обнаруживает, что порядковый номер строки находится в фиксированном состоянии и движется по его веселому пути.
  4. Первая транзакция принимает свою очередь, и, подобно второй транзакции, находит тот же зафиксированный порядковый номер, потому что она не увидит вторую, потому что она новее, чем она сама. Когда он пытается зафиксировать, он обнаруживает, что другая транзакция уже обновила записи, которые пытаются зафиксировать, и должен откатиться назад.

Вот мой вопрос: будет ли этот откат выглядеть как тупик в следе?

3 ответа

В комментарии к первоначальному вопросу вы сказали: "Мне просто интересно, будет ли конфликт обновления возникать как тупик или он будет выглядеть как-то иначе". На самом деле у меня были именно такие проблемы, когда я начал изучать изоляцию моментальных снимков. В конце концов я понял, что существует значительная разница между READ_COMMITTED_SNAPSHOT и уровнем изоляции SNAPSHOT.

Первый использует версионирование строк для чтения, но продолжает использовать эксклюзивную блокировку для записи. Итак, READ_COMMITTED_SNAPHOT - это нечто среднее между чисто пессимистическим и чисто оптимистичным управлением параллелизмом. Поскольку для записи используются блокировки, конфликты обновления невозможны, но возможны взаимоблокировки. По крайней мере, в SQL Server эти взаимные блокировки будут сообщаться как взаимные блокировки так же, как и при "нормальной" пессимистической блокировке.

Последнее (уровень изоляции SNAPSHOT) является чисто оптимистичным контролем параллелизма. Управление версиями строк используется как для чтения, так и для записи. Блокировки невозможны, но конфликты обновления есть. Последние сообщаются как конфликты обновления, а не как тупики.

Транзакция моментального снимка откатывается и получает следующее сообщение об ошибке:

 Msg 3960, Level 16, State 4, Line 1
 Snapshot isolation transaction aborted due to update conflict. You cannot use snapshot
 isolation to access table 'Test.TestTran' directly or indirectly in database 'TestDatabase' to
 update, delete, or insert the row that has been modified or deleted by another transaction.
 Retry the transaction or change the isolation level for the update/delete statement.

Чтобы предотвратить взаимоблокировку, включите оба

ALLOW_SNAPSHOT_ISOLATION и READ_COMMITTED_SNAPSHOT

ALTER DATABASE [BD] SET READ_COMMITTED_SNAPSHOT ON; ALTER DATABASE [BD] SET ALLOW_SNAPSHOT_ISOLATION ON;

здесь объясните различия http://technet.microsoft.com/en-us/sqlserver/gg545007.aspx

Другие вопросы по тегам