Для чего нужны вложенные транзакции?
======================================

 В последнее время на собеседованиях встречаю вопросы, связанные со вложенными транзакциями в MS SQL.   

```
BEGIN TRANSACTION
   BEGIN TRANSACTION
      -- Что-то делаем
   COMMIT
ROLLBACK
```
  

  

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

  

Но у меня появился вопрос - зачем в принципе нужна такая вложенность, где это может быть использовано?  

Единственное, что идёт на ум - для отката при возникновении исключения (при XACT\_ABORT = ON). 

 Собственно простой вариант: sp с транзакцией вызывает другую sp с транзакцией, которая может быть вызвана и сама - вот и "матрешка", если не озаботится например проверкой trancount.  

Ну и архитектурно - за пределами вложенной транзакции изменения еще недоступны - иногда именно это и требуется. 

 Пример:  

Есть готовые куски кода с транзакциями:  

`Транзакция 1: Пополнить счёт пользователя`  

`Транзакция 2: Дать скидку пользователю`  

  

И есть транзакция, которая отвечает за регистрацию:  

`Транзакция 3: Регистрация (создать пользователя)`  

  

Пришла задача: дать пользователю денег и скидку при регистрации.  

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

Можно конечно переписать без вложенности, но незачем.