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
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
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
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