2012-08-01 75 views
10

Hi hiểu hiện tại của tôi về các giao dịch lồng nhau trong TSQL là nếu bạn có nhiều giao dịch (một số giao dịch được lồng bên trong một giao dịch "bên ngoài"), tất cả các giao dịch phải được cam kết (với giao dịch "bên ngoài") là người cuối cùng) cho bất kỳ thay đổi nào đối với cơ sở dữ liệu được thực hiện. Nếu số lượng cam kết nhỏ hơn số giao dịch mở thì không có thay đổi nào liên quan đến bất kỳ giao dịch nào được thực hiện. Đây có phải là tổng quan chính xác về cách giao dịch lồng nhau hoạt động không?Các giao dịch lồng nhau trong TSQL

Trả lời

12

Mô tả của bạn về COMMIT là chính xác.

Kalen Delaney has an article covering the same type of behavior that you describe.

Tuy nhiên, như đã thảo luận trong bài viết Kalén, một ROLLBACK trong một giao dịch lồng nhau sẽ rollback toàn bộ giao dịch bên ngoài, không chỉ là giao dịch nội nơi rollback xảy ra.

Lưu ý kết quả như sau:

BEGIN TRAN 
SELECT @@trancount 
BEGIN TRAN 
SELECT @@trancount 
BEGIN TRAN 
SELECT @@trancount 

ROLLBACK TRAN 
SELECT @@trancount 

này được mô tả trong bài viết MSDN, Nesting Transactions:

TÁC PHẨM ROLLBACK hoặc một tuyên bố ROLLBACK GIAO DỊCH mà không có một tên giao dịch cuộn lại tất cả các giao dịch và giảm giá lồng nhau @@ TRANCOUNT đến 0. GIAO DỊCH CUỘC GỌI sử dụng giao dịch tên của giao dịch ngoài cùng trong một tập hợp các giao dịch lồng nhau cuộn trở lại tất cả các giao dịch lồng nhau và giảm giá @@ TRANCOUNT đến 0. Khi bạn không chắc liệu mình đã có trong giao dịch hay chưa, hãy chọn @@ TRANCOUNT để xác định xem đó là 1 hay nhiều lần. Nếu @@ TRANCOUNT bằng 0, bạn không có trong giao dịch.

3

Tóm lại, câu trả lời của bạn là có. Từ Nesting Transactions:

Cam kết giao dịch nội bộ bị bỏ qua bởi Cơ sở dữ liệu SQL Server Engine. Giao dịch được thực hiện hoặc quay trở lại dựa trên hành động được thực hiện ở cuối giao dịch ngoài cùng. Nếu giao dịch bên ngoài được cam kết, các giao dịch lồng nhau bên trong cũng được cam kết . Nếu giao dịch bên ngoài được cuộn lại, thì tất cả các giao dịch bên trong cũng sẽ được hoàn lại, bất kể giao dịch nội bộ có được giao dịch riêng lẻ hay không .

Về ROLLBACks, nó chỉ được phép ROLLBACK toàn bộ giao dịch bên ngoài.

Các vấn đề liên quan