Sqlserver
 sql >> Baza danych >  >> RDS >> Sqlserver

Wycofaj wewnętrzną transakcję zagnieżdżonej transakcji

SQL Server tak naprawdę nie obsługuje transakcji zagnieżdżonych. Jest tylko jedna transakcja na raz.

Ta jedna transakcja ma podstawowy licznik transakcji zagnieżdżonych, @@TRANCOUNT . Każda kolejna begin transaction zwiększa licznik o jeden, każda commit transaction zmniejsza go o jeden. Tylko commit która zmniejsza licznik do 0, naprawdę zatwierdza jedną transakcję.

rollback transaction cofa jedną transakcję i usuwa @@TRANCOUNT .

W twoim przypadku zabawnym wynikiem jest to, że SqlStatement3 jest uruchamiany na zewnątrz transakcja! Twoje ostateczne commit zgłosi wyjątek „Żądanie COMMIT TRANSACTION nie ma odpowiadającego mu wyjątku BEGIN TRANSACTION”, ale efekty SqlStatement3 są trwałe.

Na przykład:

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

Drukuje 4 . Naprawdę. :)



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Sprawdzanie kopii zapasowej serwera SQL

  2. Jak przestawić nieznaną liczbę kolumn i brak agregacji w SQL Server?

  3. Błąd — przepełnienie SqlDateTime. Musi przypadać między 1.01.1753 12:00:00 a 31.12.9999 23:59:59

  4. Funkcja AWS Lambda do połączenia z SQL Server za pomocą Pythona

  5. Jak serializować duży wykres obiektu .NET do obiektu BLOB programu SQL Server bez tworzenia dużego bufora?