2016-03-23 16 views
5

Tôi có điều này:Làm thế nào để rollback một giao dịch sử dụng đoan trang

  using (var con= new SqlConnection(ConfigurationManager.ConnectionStrings["sqlcon"].ConnectionString)) 
      { 
       try 
       { 
        // many transactions 
       } 
       catch (Exception e) 
       { 
        con.BeginTransaction().Rollback(); 
       } 
      } 

Sẽ làm việc này là câu hỏi của tôi .. Tôi biết phương pháp khác là để thực hiện một giao dịch sau đó mở thì nó rollback.

Trả lời

7

Bạn có thể sử dụng một biến TransactionScope trong một khối sử dụng tại cùng một mức độ bằng cách sử dụng khối của SqlConnection

using (TransactionScope scope = new TransactionScope()) 
using (var con= new SqlConnection(ConfigurationManager.ConnectionStrings["sqlcon"].ConnectionString)) 
{ 
    try 
    { 
     // many transactions 
     scope.Complete(); 
    } 
    catch (Exception e) 
    { 
     // Not needed any rollback, if you don't call Complete 
     // a rollback is automatic exiting from the using block 
     // con.BeginTransaction().Rollback(); 
    } 
} 
+0

Dapper mở rộng kết nối DbConnection do đó không có vấn đề gì khi sử dụng đối tượng Giao dịch chuẩn nhưng nó cồng kềnh hơn. (Tất nhiên bạn cần khai báo Giao dịch ở đầu mã và sử dụng giao dịch đó cho rollback hoặc cam kết – Steve

+1

@NoviceDeveloper lưu ý rằng tất cả các hoạt động ủy quyền chấp nhận giao dịch ado.net dưới dạng tham số tùy chọn, nếu bạn sử dụng ado. net giao dịch, hãy chắc chắn để bao gồm nó trong các cuộc gọi của bạn –

+0

@Steve Sẽ không phải là tiêu chuẩn giao dịch ado.net nhẹ hơn giao dịch môi trường xung quanh và nếu nhiều kết nối được mở trong giao dịch môi trường xung quanh, nó sẽ được thúc đẩy giao dịch phân tán –

0

Trong sự hiểu biết của tôi nếu bạn đang có kế hoạch để làm việc với một kết nối duy nhất và cần giao dịch để đảm bảo DML hoàn thành hoặc rollback, sau đó đi cho giao dịch kết nối cụ thể mà sẽ được nhẹ hơn các giao dịch xung quanh System.Transaction, đó là chung chung hơn và giúp đỡ trong phối hợp với MSDTC nếu cần thiết, như nhiều kết nối của các loại có thể được mở.

using (var con = new SqlConnection(ConfigurationManager.ConnectionStrings["sqlcon"].ConnectionString)) 
{ 
using(var txn = con.BeginTransaction()) 
    { 
    try 
    { 
     txn.Commit(); 
    } 
    catch (Exception e) 
    { 
     txn.Rollback(); 
    } 
    } 
} 
Các vấn đề liên quan