Cần lưu ý rằng khi sử dụng TransactionScope
, không cần try/catch
cấu trúc mà bạn có. Bạn chỉ cần gọi Complete
đế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à một 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à bạn không cần phải chuyển trạng thái giao dịch xung quanh.
Khi gọi BeginTransaction
trên DbConnection
đối tượng, bạn phải vượt qua mà đối tượng giao dịch xung quanh nếu bạn muốn thực hiện các hoạt động khác trong cùng một giao dịch, nhưng theo một phương pháp khác nhau.
Với TransactionScope
, miễn là phạm vi tồn tại, nó sẽ xử lý mọi thứ đăng ký với hiện tại Transaction
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 là có thể sử dụng các tài nguyên khác có thể tham gia vào các giao dịch, không chỉ là kết nối với cơ sở dữ liệu.
Cần lưu ý rằng trong các tình huống mà bạn cần khai thác tối đa các kết nối và hoạt động cơ sở dữ liệu của mình, 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 có thể sử dụng Điều phối viên giao dịch phân tán và giao dịch được chuyển thành giao dịch phân tán (ngay cả đối với một kết nối cơ sở dữ liệu duy nhất).
Trong những trường hợp này, trong khi chỉnh sửa thiết kế của mình, bạn có thể muốn xem xét chuyển một giao dịch cụ thể về kết nối.
Hoặc , nếu bạn biết mình sẽ sử dụng nhất quán một tài nguyên (và trên cùng một chuỗi), bạn có thể muốn tạo một lớp tham chiếu đếm kết nối / giao dịch của bạn.
Bạn sẽ tạo một lớp đang xây dựng, tạo tài nguyên của bạn / tăng số lượng. Nó cũng sẽ triển khai IDisposable
(trong đó bạn sẽ giảm / phát hành / cam kết / hủy bỏ khi số lượng bằng 0) và lưu trữ số lượng trong một biến đã ThreadStaticAttribute
áp dụng cho nó.
Điều này cho phép bạn tách việc quản lý giao dịch khỏi mã logic và vẫn giữ một tài nguyên đơn lẻ khá hiệu quả (thay vì chuyển sang giao dịch phân tán).