SQL Server không thực sự hỗ trợ các giao dịch lồng nhau. Chỉ có một giao dịch tại một thời điểm.
Một giao dịch này có một quầy giao dịch lồng nhau cơ bản, @@TRANCOUNT
. Mỗi begin transaction
tăng bộ đếm lên từng commit transaction
giảm nó đi một. Chỉ commit
điều đó làm giảm bộ đếm xuống 0 thực sự cam kết một giao dịch.
rollback transaction
hoàn tác một giao dịch và xóa @@TRANCOUNT
.
Trong trường hợp của bạn, kết quả hài hước là SqlStatement3 được chạy bên ngoài Một giao dịch! commit
cuối cùng của bạn sẽ đưa ra một "Yêu cầu GIAO DỊCH CAM KẾT không có ngoại lệ GIAO DỊCH BẮT ĐẦU tương ứng", nhưng ảnh hưởng của SqlStatement3 là vĩnh viễn.
Ví dụ:
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
In 4
. Có thật không. :)