2008-10-10 7 views
41

Tôi nhận được lỗi sau khi tôi cố gắng để gọi một thủ tục lưu trữ có chứa một câu lệnh SELECT:"Các hoạt động không hợp lệ cho tình trạng giao dịch" lỗi và giao dịch quy mô

Các hoạt động không phải là giá trị trong tình trạng giao dịch

Dưới đây là cấu trúc của các cuộc gọi của tôi:

public void MyAddUpdateMethod() 
{ 

    using (TransactionScope Scope = new TransactionScope(TransactionScopeOption.RequiresNew)) 
    { 
     using(SQLServer Sql = new SQLServer(this.m_connstring)) 
     { 
      //do my first add update statement 

      //do my call to the select statement sp 
      bool DoesRecordExist = this.SelectStatementCall(id) 
     } 
    } 
} 

public bool SelectStatementCall(System.Guid id) 
{ 
    using(SQLServer Sql = new SQLServer(this.m_connstring)) //breaks on this line 
    { 
     //create parameters 
     // 
    } 
} 

là vấn đề với tôi tạo ra một kết nối ion vào cùng một cơ sở dữ liệu trong giao dịch?

Trả lời

41

Sau khi thực hiện một số nghiên cứu, có vẻ như tôi không thể có hai kết nối được mở cho cùng một cơ sở dữ liệu với khối TransactionScope. Tôi cần phải sửa đổi mã của mình để trông như thế này:

public void MyAddUpdateMethod() 
{ 
    using (TransactionScope Scope = new TransactionScope(TransactionScopeOption.RequiresNew)) 
    { 
     using(SQLServer Sql = new SQLServer(this.m_connstring)) 
     { 
      //do my first add update statement    
     } 

     //removed the method call from the first sql server using statement 
     bool DoesRecordExist = this.SelectStatementCall(id) 
    } 
} 

public bool SelectStatementCall(System.Guid id) 
{ 
    using(SQLServer Sql = new SQLServer(this.m_connstring)) 
    { 
     //create parameters 
    } 
} 
+0

Tôi tình cờ gặp tình huống tương tự. Tôi đã phải tham khảo hai cơ sở dữ liệu khác nhau trong cùng một phạm vi giao dịch. Cảm ơn vì tiền hỗ trợ. – rageit

+3

Tốt bắt, một nơi phổ biến để xem điều này xảy ra là nếu bạn có một khung đăng nhập (nlog, log4net) được viết cho DB, vì khung đăng nhập sẽ tạo kết nối riêng của nó với cơ sở dữ liệu làm ứng dụng của bạn. – viggity

+0

Bạn tìm thông tin đó ở đâu? –

1

Tôi đã gặp phải lỗi này khi Giao dịch của tôi được lồng trong một giao dịch khác. Có thể thủ tục được lưu trữ khai báo giao dịch của riêng nó hay hàm gọi đó khai báo một giao dịch?

+0

tôi không có bất kỳ mã giao dịch t-sql trong bất kỳ của các thủ tục được lưu trữ của tôi. Về lý thuyết, giao dịch sẽ được kiểm soát bởi MyAddUpdateMethod() –

+0

+1 vì tôi đã nhận được lỗi này khi ngôn ngữ giao dịch trong proc được lưu trữ của tôi sai, tức là số lượng giao dịch bị sai lệch. – codeMonkey

7

Tôi cũng gặp vấn đề tương tự, tôi đã thay đổi thời gian chờ giao dịch thành 15 phút và hoạt động. Tôi hy vọng điều này sẽ hữu ích.

TransactionOptions options = new TransactionOptions(); 
options.IsolationLevel = System.Transactions.IsolationLevel.ReadCommitted; 
options.Timeout = new TimeSpan(0, 15, 0); 
using (TransactionScope scope = new TransactionScope(TransactionScopeOption.Required,options)) 
{ 
    sp1(); 
    sp2(); 
    ... 

} 
+7

Tôi mạnh mẽ nghi ngờ rằng nó không phải là timeout thay đổi hành vi nhưng thực tế là bạn đã thay đổi mức cô lập từ Serializable thành ReadCommitted. –

5

Khi tôi gặp phải ngoại lệ này, đã có "Thời gian chờ giao dịch" ngoại lệ. Vì đây là trong một phiên gỡ lỗi, khi tôi tạm dừng mã của tôi một thời gian bên trong TransactionScope, tôi đã chọn bỏ qua vấn đề này.

Khi ngoại lệ cụ thể này với một thời gian chờ xuất hiện trong mã triển khai, tôi nghĩ rằng phần sau trong bạn .config tập tin sẽ giúp bạn ra ngoài:

<system.transactions> 
     <machineSettings maxTimeout="00:05:00" /> 
</system.transactions>