Sqlserver
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> Sqlserver

Tại sao một giao dịch lồng nhau được cam kết ngay cả khi TransactionScope.Complete () không bao giờ được gọi?

Trước hết, có không có cái gọi là giao dịch lồng nhau trong SQL Server . Đây là điều quan trọng.

Thứ hai, cả hai TransactionScope đều sử dụng conn1 nên bạn (ở cấp SQL Server) đang tăng @@TRANCOUNT cho mỗi BEGIN TRANSACTION

Giải thích đơn giản:giao dịch bên trong được cam kết khi giao dịch bên ngoài cam kết bởi vì việc quay lại bên trong sẽ quay trở lại cả hai giao dịch

Đó là, COMMIT TRANSACTION (ngụ ý bởi .Complete.Dispose ) giảm @@TRANCOUNT trong khi ROLLBACK TRANSACTION (ngụ ý bởi .Dispose duy nhất) đưa nó trở lại số không. Vì vậy, quá trình khôi phục bên trong bị chặn do "không có thứ gì gọi là giao dịch lồng nhau"

Nếu bạn đã sử dụng conn2 đúng cách trong phạm vi bên trong ', nó sẽ hoạt động như mong đợi vì 2 giao dịch không liên quan ở cấp máy chủ cơ sở dữ liệu. Đó là nơi nó quan trọng ...



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Ngăn chặn SQL Injection trong mệnh đề ORDER BY

  2. SQL Server FOR XML Enclosing phần tử?

  3. Nhóm và tổng hợp dữ liệu hàng thành cột trong MS-SQL?

  4. Cách chuyển đổi phân cấp lồng nhau của xml sang bảng sql

  5. ĐẶT SỐ KHOẢN khi sử dụng