Trong ứng dụng của tôi, tôi có phương pháp trông như thế này:Cách sử dụng giao dịch cho các ngữ cảnh khác nhau?
public static bool DoLargeOperation()
{
bool res = true;
res = res && DoFirstSubOperation();
res = res && DoSecondSubOperation();
res = res && DoThirdSubOperation();
return res;
}
Và mỗi người trong số các phương pháp nội trông như thế này:
public static bool DoFirstSubOperation()
{
using (var context = new EntityFrameworkContext())
{
// data modification.
context.SaveChanges();
}
}
Ví dụ, DoFirstSubOperation()
và DoSecondSubOperation()
hoàn tất mỹ mãn, nhưng DoThirdSubOperation()
thất bại. Làm cách nào để khôi phục các thay đổi được thực hiện bởi hai hàm đầu tiên?
kết quả Cách tiếp cận này đã không mang lại:
using (var transaction = new TransactionScope())
{
res = res && DoFirstSubOperation();
res = res && DoSecondSubOperation();
res = res && DoThirdSubOperation();
}
Giải pháp duy nhất tôi thấy là để xác định bối cảnh như vậy:
public static bool DoLargeOperation()
{
bool res = true;
using (var context = new EntityFrameworkContext())
{
using (var transaction = context.Database.BeginTransaction())
{
res = res && DoFirstSubOperation(context);
res = res && DoSecondSubOperation(context);
res = res && DoThirdSubOperation(context);
if (res)
{
transaction.Commit();
}
else
{
transaction.Rollback();
}
}
}
return res;
}
Nhưng là nó có thể chấp nhận làm như vậy? Hoặc là có một giải pháp?
Điều gì đã không hoạt động trong * phương pháp này * ?. Đó là cách chính xác nhất để đạt được những gì bạn đang tìm kiếm. – abatishchev
Nó không quay trở lại thay đổi trong hoạt động hoàn thành –
Nếu không có 'scope.Commit()' nó không nên cam kết chúng, thực sự. Làm thế nào để bạn kiểm tra các thay đổi? Có lẽ bạn đang ở trong cùng một giao dịch? Hoặc bên ngoài, hãy sử dụng Management Studio? – abatishchev