2012-03-29 9 views
10

Tôi đang sử dụng 'TransactionScope' và tôi chỉ cần thực hiện một số DML trong Mã C# mà tôi đã thành công.

Tôi cần tìm hiểu rằng trạng thái của Giao dịch, điều đó đã hoàn thành thành công hay chưa?

Bởi vì trên cơ sở Trạng thái giao dịch, nếu giao dịch hoàn tất thì tôi cần thực hiện chuyển hướng đến trang khác, nếu không giao dịch không hoàn tất thành công thì tôi cần hiển thị lỗi trên trang.

tôi muốn chuyển hướng sau khi điều sau đây: -
scope.Complete();
scope.Dispose();Cách tìm trạng thái giao dịch

Vui lòng giúp tôi về vấn đề này.

Trả lời

10

Nếu bạn visit the MSDN page cho TransactionScope, bạn sẽ tìm thấy điều này ví dụ nổi tài liệu:

try 
{ 
    // Create the TransactionScope to execute the commands, guaranteeing 
    // that both commands can commit or roll back as a single unit of work. 
    using (TransactionScope scope = new TransactionScope()) 
    { 
     using (SqlConnection connection1 = new SqlConnection(connectString1)) 
     { 
      // Opening the connection automatically enlists it in the 
      // TransactionScope as a lightweight transaction. 
      connection1.Open(); 

      // Create the SqlCommand object and execute the first command. 
      SqlCommand command1 = new SqlCommand(commandText1, connection1); 
      returnValue = command1.ExecuteNonQuery(); 
      writer.WriteLine("Rows to be affected by command1: {0}", returnValue); 

      // If you get here, this means that command1 succeeded. By nesting 
      // the using block for connection2 inside that of connection1, you 
      // conserve server and network resources as connection2 is opened 
      // only when there is a chance that the transaction can commit. 
      using (SqlConnection connection2 = new SqlConnection(connectString2)) 
      { 
       // The transaction is escalated to a full distributed 
       // transaction when connection2 is opened. 
       connection2.Open(); 

       // Execute the second command in the second database. 
       returnValue = 0; 
       SqlCommand command2 = new SqlCommand(commandText2, connection2); 
       returnValue = command2.ExecuteNonQuery(); 
       writer.WriteLine("Rows to be affected by command2: {0}", returnValue); 
      } 
     } 

     // The Complete method commits the transaction. If an exception has been thrown, 
     // Complete is not called and the transaction is rolled back. 
     scope.Complete(); 

    } 

} 
catch (TransactionAbortedException ex) 
{ 
    writer.WriteLine("TransactionAbortedException Message: {0}", ex.Message); 
} 
catch (ApplicationException ex) 
{ 
    writer.WriteLine("ApplicationException Message: {0}", ex.Message); 
} 

Các bình luận có chứa giá trị nhất là cái này:

Phương pháp Toàn bộ cam kết giao dịch. Nếu một ngoại lệ đã được ném, hoàn thành không được gọi và giao dịch được cuộn lại.

Vì vậy, nếu không có trường hợp ngoại lệ nào được ném, bạn có thể tiếp tục. Đặt chuyển hướng của bạn sau scope.Complete(). Nếu một ngoại lệ được ném, giao dịch thất bại và tự động được khôi phục. Bạn có thể kiểm tra lại tình trạng giao dịch (như những người khác đã đăng) sau khi cuộc gọi đến Complete() và trước khi bạn chuyển hướng, qua Transaction.Current.TransactionInformation.Status:

if (Transaction.Current.TransactionInformation.Status == TransactionStatus.Committed) 
{ 
    // do redirect 
} 
+0

Cảm ơn rất nhiều, bạn đã giải quyết được vấn đề của mình một cách chi tiết . –

1

Làm thế nào về:

TransactionStatus status = Transaction.Current.TransactionInformation.Status; 
2

Phương pháp tốt nhất mà tôi đã tìm thấy để chụp này một cách hiệu quả nhất/một cách chính xác là như theo sau:

Bên trong tuyên bố sử dụng giao dịch và trước cuộc gọi đến phạm vi/Hoàn thành().

//Register for the transaction completed event for the current transaction 
Transaction.Current.TransactionCompleted += new TransactionCompletedEventHandler(Current_TransactionCompleted); 

Sau đó, tạo ra các chức năng xử lý sự kiện như sau:

/// <summary> 
/// Handles the TransactionCompleted event of the Current control. 
/// </summary> 
/// <param name="sender">The source of the event.</param> 
/// <param name="e">The <see cref="System.Transactions.TransactionEventArgs"/> instance containing the event data.</param> 
static void Current_TransactionCompleted(object sender, TransactionEventArgs e) 
{ 
    if (e.Transaction.TransactionInformation.Status == TransactionStatus.Committed) 
    { 
     /// Yay it's committed code goes here! 
    } 
} 

Để báo MSDN

"Bạn có thể đăng ký cho sự kiện này thay vì sử dụng một tòng quân không ổn định để có được thông tin kết quả cho các giao dịch.Tham số được truyền cho giao dịch TransactionCompletedEventHandler là một cá thể Transaction. Sau đó bạn có thể truy vấn thuộc tính TransactionInformation của cá thể cụ thể để có được một cá thể của TransactionInformation, có thuộc tính Trạng thái của nó chứa trạng thái của một giao dịch với giá trị Cam kết hoặc Bị hủy bỏ. "