Cần lưu ý rằng khi sử dụng TransactionScope
, bạn không cần phải có cấu trúc try/catch
. Bạn chỉ cần gọi Complete
trên phạm vi để thực hiện giao dịch khi phạm vi được thoát.
Điều đó đang được nói, TransactionScope
thường là lựa chọn tốt hơn vì nó cho phép bạn lồng các cuộc gọi đến các phương thức khác có thể yêu cầu giao dịch mà không cần phải chuyển trạng thái giao dịch.
Khi gọi BeginTransaction
trên đối tượng DbConnection
, bạn phải chuyển đối tượng giao dịch đó xung quanh nếu bạn muốn thực hiện các thao tác khác trong cùng một giao dịch, nhưng theo một phương pháp khác.
Với TransactionScope
, miễn là phạm vi tồn tại, nó sẽ xử lý mọi thứ đăng ký với Transaction
hiện tại trên luồng, làm cho mã của bạn sạch hơn và dễ bảo trì hơn.
Trên hết, bạn có thêm lợi ích khi có thể sử dụng các tài nguyên khác có thể tham gia vào giao dịch, không chỉ kết nối với cơ sở dữ liệu.
Cần lưu ý rằng trong trường hợp bạn cần phải tận dụng tối đa các kết nối và hoạt động cơ sở dữ liệu, bạn có thể không muốn sử dụng TransactionScope
; thậm chí đối với một cơ sở dữ liệu duy nhất, bạn chạy khả năng của Điều phối viên giao dịch phân tán đang được sử dụng và có giao dịch được chuyển thành một giao dịch phân tán (ngay cả đối với một kết nối cơ sở dữ liệu).
Trong những trường hợp này, trong khi làm lộn xộn thiết kế của bạn, bạn có thể cân nhắc việc chuyển giao một giao dịch cụ thể cho từng kết nối.
Hoặc, nếu bạn biết bạn sẽ sử dụng một tài nguyên nhất quán (và trên cùng một chuỗi), bạn có thể muốn tạo lớp tham chiếu đếm kết nối/giao dịch của mình.
Bạn sẽ tạo một lớp học đang được xây dựng, tạo tài nguyên/số gia số của bạn. Nó cũng sẽ thực hiện IDisposable
(trong đó bạn sẽ giảm/phát hành/cam kết/hủy bỏ khi đếm là số không), và lưu trữ số đếm trong một biến có áp dụng ThreadStaticAttribute
.
Điều này cho phép bạn tách quản lý giao dịch khỏi mã logic và vẫn giữ một nguồn tài nguyên số ít hiệu quả (thay vì chuyển sang giao dịch phân phối).
Nếu bạn cần gửi một cái gì đó với tính chất chu kỳ (phổ biến), bạn nhấn một lỗi trong LINQ to SQL yêu cầu bạn xóa một phần của mỗi tham chiếu 2 chiều, gửi, sửa các tham chiếu 2 chiều và gửi lại. Bạn cần phải quấn tất cả điều này trong giao dịch của riêng bạn để làm như vậy. Đó là một nhu cầu phổ biến, do đó, "Đừng lo lắng về nó" không phải là câu trả lời tốt nhất. –