2012-03-05 29 views
7

Tôi đang đối mặt với một vấn đề khiến tôi phát điên trong vài ngày, hy vọng ai đó có thể giúp tôi. Đây rồi;TransactionScope không quay trở lại bên trong phương thức dịch vụ wcf, không quay lại nếu được gọi trực tiếp

Tôi đang sử dụng EF4 với cơ sở dữ liệu oracle, sử dụng dotConnect cho oracle từ devart làm nhà cung cấp. Tôi có phương thức dịch vụ wcf gọi phương thức DeleteCabinet bên dưới;

public void DeleteCabinet(string pRID) 
{ 
    using(TransactionScope tranScope = new TransactionScope()) 
    { 
     DBUtils.DeleteCabinetAndShelves(pRecordId); 

     //throw exception to test record not deleted 
     throw new Exception("xxx something has happened test xxx"); 

     tranScope.Complete(); 
    } 
} 

DBUtils.DeleteCabinetAndShelves trông giống như dưới đây;

public void DeleteCabinetAndShelves(string pRecordId) 
{ 
    using(var context = new EdrmEntities()) 
    { 
     var cabinet = context.Cabinets.Include("Shelves").Single(p => p.RID == pCabinetRID); 

     //mark all cabinet shelves for deletion 
     if (cabinet.Shelves != null) 
     { 
      foreach (var tempShelf in cabinet.Shelves.ToList()) 
      { 
       context.DeleteObject(tempShelf); 
      } 
     } 

     //mark cabinet for deletion 
     context.DeleteObject(cabinet); 

     //save 
     context.SaveChanges(); 
    } 
} 

khi tôi gọi DeleteCabinet từ bên trong dự án thử nghiệm của tôi, không phải cuộc gọi wcf mà gọi trực tiếp, hoạt động OK. Nó ném ngoại lệ và giao dịch được khôi phục. Do đó không có bản ghi nào bị xóa khỏi DB như mong đợi

Vấn đề là khi tôi gọi phương thức dịch vụ (gọi là DeleteCabinet) từ máy khách, ngoại lệ được ném, nhưng bản ghi IS bị xóa khỏi db. Giao dịch không quay trở lại!

có vẻ như gọi phương thức wcf không quay lại giao dịch, nhưng có vẻ như là điên (ít nhất với tôi), có ai biết lý do tại sao điều này có thể xảy ra không?

Cảm ơn trước

+0

Tôi tin rằng điều này phần lớn sẽ phụ thuộc vào các ràng buộc WCF của bạn và liệu họ có hỗ trợ giao dịch hay không. Cập nhật câu hỏi của bạn để tiết lộ các ràng buộc của bạn và tờ khai hợp đồng dịch vụ WCF của bạn. – Rabid

+0

Sửa lỗi nếu tôi sai, nhưng vì dịch vụ của tôi không tham gia vào một giao dịch được khách hàng bắt đầu (không có giao dịch wcf theo nghĩa đó), nên các cài đặt đó không liên quan trong trường hợp này. tức là: khách hàng gọi đến phương thức dịch vụ không phải là bên trong transactioncope, đó là máy chủ bắt đầu và hoàn tất giao dịch như đã thấy ở trên. – rayback2

+1

Ohh, tôi hiểu rồi, thật lạ lùng. Bạn có cho phép WCF gây lỗi cho kênh hoặc bạn xử lý ngoại lệ trong cuộc gọi dịch vụ WCF và gửi kết quả lại cho khách hàng không? 'EdrmEntities' có tạo ra' EntityConnection' của chính nó hay là nó có thể sử dụng một kết nối chia sẻ đã được tự động gia nhập vào một giao dịch ngầm bên ngoài 'TransactionScope' của bạn? – Rabid

Trả lời

3

Bạn gắn thẻ bài của bạn với DevArtDotConnect thẻ ... Tôi tự hỏi nếu điều này là một lỗi trong các nhà cung cấp DevArt chứ không phải là một cái gì đó gắn liền với WCF/Entity Framework/System.Transactions. Bạn có thể kiểm tra lý thuyết bằng cách xem nếu nó xảy ra với một ObjectContext đang sử dụng Nhà cung cấp Máy chủ SQL được tích hợp (hoặc thậm chí Oracle's own EF provider đã được phát hành gần đây) và xem sự cố vẫn xảy ra. Đó là điều duy nhất tôi có thể nghĩ đến vì mã có vẻ chính xác 100%.

+0

Đã thử với nhà cung cấp của Oracle, và có vẻ như nó hoạt động. Tôi đang tìm ra nếu nó là một lỗi trong nhà cung cấp devarts, nó sẽ được phát hiện trước đây (và cố định), vì vậy tôi nghĩ rằng nó phải có một cái gì đó để làm với cấu hình. Sẽ liên hệ với nhóm hỗ trợ của họ về vấn đề này. ' – rayback2

1

Nhờ @Rabid và @luksans ý kiến ​​mang tính xây dựng vấn đề được giải quyết, và nó bật ra nó không có gì để làm với WCF hoặc nhà cung cấp devart của là buggy

Đây là điều; wcf dịch vụ (mà không rollback), và thử nghiệm tích hợp (mà đã làm) là bên trong các dự án khác nhau, do đó cấu hình các tập tin khác nhau. Họ đã ra khỏi đồng bộ đôi khi trong quá khứ, và sự khác biệt là trong Enlist=false một phần. Vì vậy, chuỗi kết nối của dự án wcf có Enlist=false trong khi dự án thử nghiệm thì không. Đó là cách ảo tưởng về giao dịch thất bại của WCF được sinh ra.

Xóa Enlist=false từ chuỗi kết nối của dự án wcf đã khắc phục sự cố.

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