Có 2 loại giao dịch chính; giao dịch kết nối và giao dịch xung quanh. Một giao dịch kết nối (chẳng hạn như SqlTransaction) được gắn trực tiếp với kết nối db (chẳng hạn như SqlConnection), có nghĩa là bạn phải tiếp tục truyền kết nối xung quanh - trong một số trường hợp, nhưng không cho phép "tạo / sử dụng / giải phóng" sử dụng và không cho phép làm việc chéo db. Một ví dụ (được định dạng cho không gian):
using (IDbTransaction tran = conn.BeginTransaction()) {
try {
// your code
tran.Commit();
} catch {
tran.Rollback();
throw;
}
}
Không quá lộn xộn, nhưng giới hạn trong "kết nối" của chúng tôi. Nếu chúng ta muốn gọi ra các phương thức khác nhau, bây giờ chúng ta cần truyền "liên kết" xung quanh.
Thay thế là một giao dịch xung quanh; mới trong .NET 2.0, đối tượng TransactionScope (System.Transilities.dll) cho phép sử dụng trên một loạt các hoạt động (nhà cung cấp phù hợp sẽ tự động tranh thủ trong giao dịch xung quanh). Điều này giúp dễ dàng phù hợp với retro với mã hiện tại (không giao dịch) và nói chuyện với nhiều nhà cung cấp (mặc dù DTC sẽ tham gia nếu bạn nói chuyện với nhiều hơn một).
Ví dụ:
using(TransactionScope tran = new TransactionScope()) {
CallAMethodThatDoesSomeWork();
CallAMethodThatDoesSomeMoreWork();
tran.Complete();
}
Lưu ý ở đây rằng hai phương thức có thể xử lý các kết nối của riêng chúng (mở / sử dụng / đóng / hủy), nhưng chúng sẽ âm thầm trở thành một phần của giao dịch xung quanh mà không cần chúng tôi phải chuyển bất kỳ thứ gì vào.
Nếu lỗi mã của bạn, Dispose () sẽ được gọi mà không có Complete (), vì vậy nó sẽ được khôi phục. Vv lồng nhau dự kiến sẽ được hỗ trợ, mặc dù bạn không thể hoàn trả giao dịch bên trong nhưng vẫn hoàn thành giao dịch bên ngoài: nếu bất kỳ ai không hài lòng, giao dịch sẽ bị hủy bỏ.
Ưu điểm khác của TransactionScope là nó không chỉ gắn với cơ sở dữ liệu; bất kỳ nhà cung cấp nhận thức giao dịch có thể sử dụng nó. WCF chẳng hạn. Hoặc thậm chí có một số mô hình đối tượng tương thích với TransactionScope xung quanh (ví dụ: các lớp .NET có khả năng khôi phục - có lẽ dễ dàng hơn một vật lưu niệm, mặc dù tôi chưa bao giờ sử dụng phương pháp này).
Tất cả trong tất cả, một đối tượng rất, rất hữu ích.
Một số hãy cẩn thận:
- Trên SQL Server 2000, một Giao diện viên sẽ chuyển đến DTC ngay lập tức; điều này đã được sửa trong SQL Server 2005 trở lên, nó có thể sử dụng LTM (ít chi phí hơn nhiều) cho đến khi bạn nói chuyện với 2 nguồn, v.v., khi nó được nâng lên thành DTC.
- Có một trục trặc có nghĩa là bạn có thể cần phải điều chỉnh chuỗi kết nối của mình