Назначение вложенных транзакций

Я никогда не понимал, для чего подходит вложенная транзакция. Вложение вложенной транзакции ничего не совершает - она ​​просто уменьшает @@TRANCOUNT. И ROLLBACK откатывает все.

BEGIN TRANSACTION
   //do an update
   BEGIN TRANSACTION
     //do an insert
   COMMIT TRANSACTION
COMMIT TRANSACTION

В чем разница:

BEGIN TRANSACTION
     //do an update
     //do an insert
COMMIT TRANSACTION

Пожалуйста, дайте мне пример, почему следует использовать вложенные транзакции и как они влияют.

С уважением, Петар

Ответ 1

Вложенные транзакции позволяют вашему коду вызывать другой код (например, SP), который использует транзакции самостоятельно, не совершая при этом транзакции.

Тем не менее, вы можете использовать safepoints для отката внутри транзакции.

Здесь статья CodeProject, посвященная этому.

Ответ 2

ЕСЛИ у вас сценарий, в котором вы вызываете один SP, который содержит в себе другой вызов SP. и что внутренний SP также может быть вызван независимо от вашего приложения. В этом случае необходимо разместить внутреннюю транзакцию (на внутреннем SP), а также на родительский SP.