Sqlserver
 sql >> база данни >  >> RDS >> Sqlserver

Отмяна на вътрешната транзакция на вложената транзакция

SQL Server всъщност не поддържа вложени транзакции. Има само една транзакция в даден момент.

Тази транзакция има основен вложен брояч на транзакции, @@TRANCOUNT . Всяка следваща begin transaction увеличава брояча с единица за всяка commit transaction го намалява с единица. Само commit който намалява брояча до 0, наистина ангажира една транзакция.

rollback transaction отменя една транзакция и изчиства @@TRANCOUNT .

Във вашия случай забавният резултат е, че SqlStatement3 се изпълнява отвън сделка! Вашият последен commit ще хвърли изключение „Заявката за COMMIT TRANSACTION няма съответстващо BEGIN TRANSACTION“, но ефектите от SqlStatement3 са постоянни.

Например:

create table #t (col1 int)
insert #t (col1) values (1)
BEGIN TRANSACTION
update #t set col1 = 2 -- This gets rolled back
BEGIN TRANSACTION
update #t set col1 = 3 -- This gets rolled back too
ROLLBACK TRANSACTION
update #t set col1 = 4 -- This is run OUTSIDE a transaction!
COMMIT TRANSACTION -- Throws error
select col1 from #t

Отпечатва 4 . Наистина ли. :)



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. SQL Server 2008 R2 HASHBYTES SHA2 връща null

  2. Как да напиша име на колона с точка (.) в клаузата SELECT?

  3. SQL Server SHOWPLAN_TEXT

  4. Вземете стойност на колона от низ име на колона sql

  5. SSRS:повторете стойността на групата редове в най-ляво табликс на всеки ред