SQL Server: может ли взаимоблокировка транзакций при ФИКСАЦИИ?

#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.   

Это не тупик, хотя и имеет аналогичные последствия, приводящие к полному прерыванию транзакции.