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
}
Nguồn
2012-03-29 22:19:40
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 . –