2009-05-26 35 views
7

Trong ứng dụng web của tôi, tôi đã tiếp tục kiểm tra các hành động của người dùng. Vì vậy, bất cứ khi nào người dùng thực hiện một hành động, tôi cập nhật đối tượng mà hành động được thực hiện và tiếp tục theo dõi kiểm tra của hành động đó.Sử dụng các giao dịch với subsonic

Bây giờ nếu tôi lần đầu tiên sửa đổi đối tượng và sau đó cập nhật đường mòn kiểm toán nhưng đường mòn kiểm tra không thành công thì sao?

Rõ ràng là tôi cần phải khôi phục các thay đổi đối với đối tượng đã sửa đổi. Tôi có thể sử dụng Sql-giao dịch trong ứng dụng đơn giản, nhưng tôi đang sử dụng Subsonic để nói chuyện với db. Làm thế nào tôi có thể xử lý tình hình?

Trả lời

10

Cái gì như:

Using ts As New System.Transactions.TransactionScope() 
    Using sharedConnectionScope As New SubSonic.SharedDbConnectionScope() 

' Do your individual saves here 

' If all OK 
     ts.Complete() 

    End Using 
End Using 
+1

Tôi có thể xác nhận TransactionScope hoạt động chính xác với SubSonic và thực hiện chính xác giao dịch rollback. – kd7

+0

Cảm ơn @kevinw và @bnkdev. Tôi đang sử dụng C# vì vậy tôi sẽ đăng các mã trong C# cũng vì vậy nó có thể dễ dàng được sử dụng bởi những người khác. Ngoài ra, bạn sẽ không đặt các cá nhân tiết kiệm hoặc hành động bên trong try/catch vì vậy nó dễ dàng hơn để biết nếu tất cả Ok hay không? – TheVillageIdiot

14

Các answer do @Kevinw là hoàn toàn ổn. Tôi đang đăng bài này giống như bản dịch câu trả lời của anh ấy cho mã C#. Tôi không sử dụng ý kiến ​​vì nó sẽ không định dạng mã :) Ngoài ra tôi đang sử dụng try/catch để biết nếu giao dịch nên hoàn thành hoặc được cuộn lại.

using (System.Transactions.TransactionScope ts = new TransactionScope()) 
{ 
    using (SharedDbConnectionScope scs = new SharedDbConnectionScope()) 
    { 
     try 
     { 
      //do your stuff like saving multiple objects etc. here 

      //everything should be completed nicely before you reach this 
      //line if not throw exception and don't reach to line below 
      ts.Complete(); 
     } 
     catch (Exception ex) 
     { 
      //ts.Dispose(); //Don't need this as using will take care of it. 
      //Do stuff with exception or throw it to caller 
     } 
    } 
} 
+1

Gọi 'ts.Dispose()' bên trong điều khoản bắt buộc là không bắt buộc vì câu lệnh sử dụng sẽ xử lý nó. Trong trường hợp chung, nó thậm chí có thể gây ra các vấn đề như 'SharedDbConnectionScope' hoặc mã nhận thức giao dịch khác được đưa ra bên trong phạm vi giao dịch có thể phụ thuộc vào việc được xử lý trước khi phạm vi giao dịch kèm theo được xử lý. –

+0

@OskarBerggren đã nhận xét. – TheVillageIdiot

1

Không. Nếu tôi đặt SharedDbConnectionScope bên ngoài các thay đổi là hiển thị trong cơ sở dữ liệu trước ts.Complete(). Đặt nó bên trong các khối máy chủ cho đến khi hoạt động được thực hiện.

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