2015-03-03 16 views
5

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()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?

+0

Đ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

+0

Nó không quay trở lại thay đổi trong hoạt động hoàn thành –

+0

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

Trả lời

5

Vâng, đó là mẫu chính xác. Việc chuyển ngữ cảnh vào các phương thức cho phép các phương thức được tái sử dụng ở nhiều vị trí vì ngữ cảnh và giao dịch sẽ được người gọi quản lý.

Mặc dù, có thể bạn sẽ muốn ngừng xử lý các phương pháp tiếp theo khi phương thức đầu tiên không thành công. Bạn cũng có thể muốn quấn cuộc gọi đến trẻ em trong một try/catch để cho bất kỳ ngoại lệ cho phép rollback xảy ra một cách chính xác ...

try 
{ 
    res = DoFirstSubOperation(context); 
    if (res) 
     res = DoSecondSubOperation(context); 
    if (res) 
     res = DoThirdSubOperation(context);  

    if (res) 
     transaction.Commit(); 
    else 
     transaction.Rollback(); 
} 
catch 
{ 
    transaction.Rollback(); 
} 

Nếu phương pháp mà con bạn đang xử lý trường hợp ngoại lệ thì bạn có thể bỏ qua những cánh try/bắt lấy.

+0

Cảm ơn bạn! Tôi chỉ đơn giản hóa ví dụ để chỉ hiển thị bản chất. –

Các vấn đề liên quan