#sql-server #transactions
Вопрос:
Представьте себе транзакцию SQL Server, например, с двумя атомарными операторами SQL, A и B.
begin tran insert into .. (**A**) update .. (**B**) commit tran
Либо A, либо B могут привести к тупику — если это произойдет, и если наша транзакция будет выбрана в качестве жертвы тупика, то очень плохо — мы не можем продолжать.
Теперь представьте, что мы добрались до этой точки сценария без возникновения тупика:
--all done except for: commit tran
Возможно ли здесь возникновение взаимоблокировки? т. Е. после всех фактических вставок/удалений/обновлений/всего, что было запущено, может ли произойти взаимоблокировка COMMIT
?
Комментарии:
1. Наверное, нет. Механизм оптимизирован для предположения, что транзакции будут зафиксированы, поэтому фиксация-это в основном формальность, запись в журнале транзакций, что все прошло хорошо-это дорогостоящие откаты. Я говорю «скорее нет», потому что вполне вероятно, фиксации, не нужно принимать определенные внутренние защелки, и в теории там может быть тупик с другой коммит, если те не всегда берется в том же порядке, но было бы очень странно, если не сказать больше, если двигатель был разработан с дизайном недостаток, как и что. Возможно, лучший вопрос: как вы думаете, принесет ли вам пользу знание этого?
Ответ №1:
Нет, я не верю, что это возможно.
Во время фиксации все блокировки, которые необходимо снять, уже сняты. Единственное, что нужно сделать, — это зафиксировать журнал транзакций (сделать его долговечным), для чего требуется только защелка. Насколько я понимаю, защелки не тупиковые.
Есть одна возможная проблема:
При работе в SNAPSHOT
изоляции возможно возникновение конфликта обновлений
Snapshot isolation transaction aborted due to update conflict.
Это не тупик, хотя и имеет аналогичные последствия, приводящие к полному прерыванию транзакции.