Я прочитал через MSDN на ROLLBACK TRANSACTION и вложенных транзакций . Хотя я вижу смысл ROLLBACK TRANSACTION savepointname
, я не понимаю ROLLBACK TRANSACTION transactionname
.
- Работает только тогда, когда
transactionname
является самой внешней транзакцией
ROLLBACK
всегда откатывает всю «стопку» транзакций, кроме случая savepointname
Обычно, когда я читаю документацию, за исключением случая сохранения, ROLLBACK
откатывает все транзакции (до @@TRANCOUNT=0
). Единственное отличие, которое я вижу, это фрагмент:
Если оператор транзакции ROLLBACK TRANSACTION с именем
внешняя транзакция выполняется на любом уровне множества вложенных
транзакции, все вложенные транзакции откатываются.
Если оператор ROLLBACK WORK или ROLLBACK TRANSACTION без
Параметр транзакция_имя выполняется на любом уровне множества вложенных
транзакция, она откатывает все вложенные транзакции, включая
самая внешняя транзакция.
Из прочтенного мне следует, что при откате именованной транзакции (которая должна быть именем самой внешней транзакции) будут откатываться только вложенные транзакции. Это придаст смысл откату именованной транзакции. Итак, я настроил тест:
CREATE TABLE #TEMP (id varchar(50))
INSERT INTO #TEMP (id) VALUES ('NO')
SELECT id AS NOTRAN FROM #TEMP
SELECT @@TRANCOUNT AS NOTRAN_TRANCOUNT
BEGIN TRAN OUTERTRAN
INSERT INTO #TEMP (id) VALUES ('OUTER')
SELECT id AS OUTERTRAN FROM #TEMP
SELECT @@TRANCOUNT AS OUTERTRAN_TRANCOUNT
BEGIN TRAN INNERTRAN
INSERT INTO #TEMP (id) VALUES ('INNER')
SELECT id AS INNERTRAN FROM #TEMP
SELECT @@TRANCOUNT AS INNERTRAN_TRANCOUNT
ROLLBACK TRAN OUTERTRAN
IF @@TRANCOUNT > 0 ROLLBACK TRAN
SELECT id AS AFTERROLLBACK FROM #TEMP
SELECT @@TRANCOUNT AS AFTERROLLBACK_TRANCOUNT
DROP TABLE #TEMP
В результате (все "X строки затронуты" удалены)
NOTRAN
--------------------------------------------------
NO
NOTRAN_TRANCOUNT
----------------
0
OUTERTRAN
--------------------------------------------------
NO
OUTER
OUTERTRAN_TRANCOUNT
-------------------
1
INNERTRAN
--------------------------------------------------
NO
OUTER
INNER
INNERTRAN_TRANCOUNT
-------------------
2
AFTERROLLBACK
--------------------------------------------------
NO
AFTERROLLBACK_TRANCOUNT
-----------------------
0
Обратите внимание, что при изменении
на выходе не будет
никакой разницы
ROLLBACK TRAN OUTERTRAN
просто
ROLLBACK TRAN
Так в чем смысл ROLLBACK TRANSACTION <b>named_transaction</b>
?