Hãy xem xét các phương pháp sau đây.TransactionScope có được áp dụng hoàn toàn cho đến khi hoàn thành một cách rõ ràng không?
DoA()
{
using (TransactionScope scope = new TransactionScope)
{
using (SqlConnection connection = new SqlConnection(connectionString))
{
connection.Open();
SqlCommand command = new SqlCommand(query, connection);
command.ExecuteNonReader();
DoB();
scope.Complete();
}
}
}
DoB()
{
using (TransactionScope scope = new TransactionScope)
{
using (SqlConnection connection = new SqlConnection(connectionString))
{
connection.Open();
SqlCommand command = new SqlCommand(query, connection);
command.ExecuteNonReader();
DoC();
scope.Complete();
}
}
}
DoC()
{
using (SqlConnection connection = new SqlConnection(connectionString))
{
connection.Open();
SqlCommand command = new SqlCommand(query, connection);
command.ExecuteNonReader();
}
}
Nếu chúng ta gọi là DoA()
, thực hiện các tương tác tiếp theo trong DoB()
và DoC()
chạy trong bối cảnh giao dịch DoA()
's vì nó gắn liền với SQL Server? DoC() có chạy trong ngữ cảnh của cả giao dịch của DoA()
và DoB()
?
(Hay tôi hiển nhiên hiểu lầm gì đó?)
Bạn nhận giao dịch lồng nhau :) – DaveShaw
Có các tùy chọn kiểm soát điều này. Xem "Quản lý luồng giao dịch bằng cách sử dụng TransactionScopeOption" của http://msdn.microsoft.com/en-us/library/ms172152(v=vs.85).aspx – AaronLS
Lưu ý thêm về các giao dịch lồng nhau phải sử dụng cùng một mức độ cô lập theo thứ tự để tham gia vào giao dịch môi trường xung quanh. – AaronLS