2011-08-08 40 views
9

Tôi tin rằng tôi hiểu được TransactionScopeOption.SuppressTransactionScopeOption.Required nhưng gặp khó khăn khi hiểu những gì TransactionScopeOption.RequiresNew thực hiện. Dựa trên lời giải thích cuối cùng mà tôi đã đọc, liệu hai khối mã sau đây có giống nhau không? Đây có phải là biểu diễn chính xác về những gì RequiresNew nghĩa là gì?Tìm hiểu về TransactionScopeOptions: RequiresNew = Suppress + Required?

using (var ts1 = new TransactionScope(TransactionScopeOption.RequiresNew)) 
{ 
    DoStuff(); 
    ts1.Complete(); 
} 

using (var ts2 = new TransactionScope(TransactionScopeOptions.Suppress)) 
{ 
    using (var ts3 = new TransactionScope()) 
    { 
    DoStuff(); 
    ts3.Complete(); 
    } 

    ts2.Complete(); // not required but recommended for consistency's sake 
} 

Trả lời

11

Để có được một sự hiểu biết tốt về các giao dịch phạm vi bạn có thể đọc this msdn article

tôi không thể tìm thấy một lời giải thích tốt như thế nào hai sẽ khác ngoại trừ việc số các phạm vi lồng nhau được tạo khác nhau. Cả hai trường hợp sẽ dẫn đến cùng một lượng giao dịch bất kể giao dịch đã tồn tại hay chưa. Tôi không thể tìm thấy một nguồn tài nguyên tốt để tham khảo nhưng tôi sẽ luôn luôn đi cho RequiresNew trên một Suppress kết hợp/yêu cầu. RequiresNew về cơ bản có nghĩa là: "bất kể nếu đã có hoặc không phải là một giao dịch cho tôi một cái mới".

Cập nhật: Trong trường hợp mắt xích đầu tiên vẫn bị phá vỡ, bạn có thể tìm thấy nó trong các kho lưu trữ Wayback here

+0

Đã đã làm, đó là những gì đã cho tôi ấn tượng này. Trích dẫn: "' RequiresNew': mã chứa phụ thuộc vào giao dịch, nhưng phải được cam kết độc lập hoặc được cuộn lại. 'Suppress': mã chứa thực hiện bù trừ của chính nó, do đó không phải là một phần của giao dịch." Điều này có nghĩa là (đối với tôi) "cam kết" hoặc "quay lại" một RequireNew TransactionScope không thể được điều khiển hoặc phụ thuộc vào giao dịch bên ngoài - không ảnh hưởng đến giao dịch khác. Đó là những gì mà Suppress nên thực hiện bên trong TransactionScope. – Jaxidian

+0

Trong tất cả sự trung thực, tôi đã hiểu sai khối mã thứ hai của bạn và nghĩ rằng bạn có 2 cặp giao dịch lồng nhau() (Tôi đã bỏ qua Suppress ở bên ngoài). Tôi sẽ chỉnh sửa – Eddy

+2

Và chỉ để làm rõ ... Nếu tôi rollback giao dịch RequireNew, mà không có cách nào ảnh hưởng đến một TransactionScope cha mẹ, và tương tự như vậy, nếu tôi rollback một TransactionScope cha mẹ, mà không có cách nào ảnh hưởng đến giao dịch RequiresNew? Xin lỗi, chỉ muốn đảm bảo rằng tôi hiểu đầy đủ các tùy chọn này. Rất nhiều tác dụng phụ có khả năng gây khó chịu (bế tắc, hoạt động phi nguyên tử, vv) nếu tôi nhận được những hỗn hợp này! – Jaxidian