2009-08-27 34 views
6

Tôi muốn tạo một giao dịch, viết một số dữ liệu trong giao dịch con, đọc dữ liệu và quay lại giao dịch.Nhiều vấn đề về giao dịch

using(var transaction = new TransactionScope()) 
{ 
    using(var transaction = new TransactionScope()) 
    { 
      // save data via LINQ/DataContext 
      transaction.Complete(); 
    } 
    // Get back for assertions 
    var tempItem = // read data via LINQ/DataContext THROWS EXCEPTION 
} 

Nhưng khi đọc tôi nhận được "System.Transactions.TransactionException: Các hoạt động không hợp lệ cho tình trạng của giao dịch.".

Tôi nên đặt thuộc tính giao dịch để tránh điều này như thế nào?

+0

Bạn đang sử dụng db nào? – TheVillageIdiot

+0

Microsoft SQL 2005 – boj

+0

có thể giúp http://stackoverflow.com/questions/2884863/under-what-circumstances-is-an-sqlconnection-automatically-enlisted-in-an-ambien – Joe

Trả lời

9

Ngoại lệ này không thể được gỡ lỗi mà không có dấu vết ngăn xếp đầy đủ. Nó có ý nghĩa khác nhau tùy thuộc vào ngữ cảnh. Thông thường nó có nghĩa là bạn đang làm một cái gì đó bạn không nên bên trong giao dịch, nhưng mà không nhìn thấy các cuộc gọi db hoặc ngăn xếp dấu vết tất cả mọi người có thể làm là đoán. Một số nguyên nhân phổ biến mà tôi biết (và điều này hoàn toàn không có nghĩa là tôi chắc chắn) bao gồm:

  1. Truy cập nhiều nguồn dữ liệu (tức là các chuỗi kết nối khác nhau) trong một lồng nhau TransactionScope. Điều này gây ra khuyến mãi cho một giao dịch phân phối và nếu bạn không chạy DTC nó sẽ thất bại. Câu trả lời thường là không phải để bật DTC, nhưng để làm sạch giao dịch của bạn hoặc bao bọc quyền truy cập dữ liệu khác bằng TransactionScope(TransactionOptions.RequiresNew) mới.
  2. Ngoại lệ chưa xử lý trong số TransactionScope.
  3. Bất kỳ thao tác nào vi phạm mức cách ly, chẳng hạn như cố gắng đọc các hàng vừa chèn/cập nhật.
  4. SQL bế tắc; các giao dịch thậm chí có thể tự bế tắc trong một số trường hợp nhất định, nhưng nếu # 1 được áp dụng, việc cô lập các ops khác thành các giao dịch mới có thể gây ra deadlocks nếu bạn không cẩn thận.
  5. Thời gian chờ giao dịch.
  6. Bất kỳ lỗi nào khác từ cơ sở dữ liệu.

Tôi chắc chắn không biết mọi nguyên nhân có thể xảy ra, nhưng nếu bạn đăng theo dõi ngăn xếp hoàn chỉnh và cuộc gọi db thực trong mã của bạn, tôi sẽ xem xét và cho bạn biết nếu tôi thấy bất kỳ điều gì.

+0

Andy, cảm ơn câu trả lời này. Câu hỏi về # 3 tái: "bất kỳ hoạt động nào vi phạm mức cô lập". Điều sau có vi phạm mức cô lập không? DECLARE (atSmbol) someCount INT; CẬP NHẬT dbo.Cái gì SET (atSmbol) someCount = [SomeCount] = [SomeCount] + 1 WHERE ID = 123 Trong cách sử dụng của tôi (atSmbol) someCount là tham số đầu ra. Nếu có, điều này sẽ không vi phạm mức cô lập? DECLARE (atSmbol) someCount INT; CẬP NHẬT dbo.Một cái gì đó SET [SomeCount] = (atSmbol) someCount = [SomeCount] + 1 WHERE ID = 123 Lưu ý, tôi nghĩ rằng tôi đang cố gắn thẻ ai đó để thông báo khi tôi sử dụng biểu tượng. – Wes

4

Bạn có hai đối tượng giao diện lồng nhau ??

Và không thử chặn khối.

http://msdn.microsoft.com/en-us/library/system.transactions.transactionscope.aspx

Tôi nghĩ rằng bạn sẽ tìm ra câu trả lời cụ thể là bạn không thể hoàn thành một giao dịch mà vẫn chưa bắt đầu bất cứ điều gì, nó ở trong trạng thái không hợp lệ. Bạn có thực sự có bất kỳ mã nào mà LINQ của bạn nhận xét không? sao một kết nối thực sự được thiết lập?

+0

Vâng, lồng nhau. Nhưng tại sao bạn lại liên kết MSDN? – boj

+0

vì bài viết được liên kết giải thích lý do tại sao bạn nhận được ngoại lệ đó, có lẽ? –

+0

@boj: vì nó có ví dụ về cách sử dụng với các nhận xét hay giải thích những gì xảy ra và khi nào. –

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