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

Dlaczego transakcja zagnieżdżona jest zatwierdzana, nawet jeśli TransactionScope.Complete() nigdy nie jest wywoływana?

Po pierwsze, istnieje nie ma czegoś takiego jak zagnieżdżona transakcja w SQL Server . To ważne.

Po drugie, oba TransactionScopes używają conn1, więc (na poziomie SQL Server) zwiększasz @@TRANCOUNT dla każdej BEGIN TRANSACTION

Proste wyjaśnienie:transakcja wewnętrzna zostaje zatwierdzona, gdy transakcja zewnętrzna zostanie zatwierdzona, ponieważ wycofanie wewnętrznej spowodowałoby wycofanie obie transakcje

Oznacza to, że COMMIT TRANSACTION (implikowane przez .Complete i .Dispose ) zmniejsza @@TRANCOUNT while ROLLBACK TRANSACTION (implikowane przez .Dispose tylko) cofa go do zera. Tak więc wewnętrzne wycofanie jest pomijane, ponieważ „nie ma czegoś takiego jak transakcje zagnieżdżone”

Jeśli poprawnie użyłeś conn2 w wewnętrznym zakresie, działałoby to zgodnie z oczekiwaniami, ponieważ 2 transakcje nie są powiązane na poziomie serwera bazy danych. I właśnie to ma znaczenie...



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Jak używać polecenia `sqlcmd` bez nazwy użytkownika i hasła w SQL Server 2008?

  2. Wyszukiwanie pełnotekstowe programu SQL Server nie znajduje moich wierszy

  3. Konwersja liczby na słowa w SQL

  4. Utworzyć procedurę składowaną do dodania z automatycznym przyrostem jako polem podstawowym?

  5. Aktualnie uruchomione zapytanie wewnątrz procedury składowanej