2009-12-29 15 views
7

Tôi đã tạo kết nối sql, CN1. Sau đó, CN1 này được mở ra. Sau đó trong mã có một giao dịch. Nếu tôi thực hiện một lệnh sql trên kết nối CN1 này, điều này có trong giao dịch không?Điều quan trọng là phải mở kết nối sql trong giao dịch

Mã trông như thế này;

SqlConnection cn1 = new SqlConnection(); 
cn1.Open(); //connection opened when there is no ambient transaction. 
... 

using(TransactionScope scope = new TransactionScope()) 
{ 
    SqlCommand cmd; //a typical sql command. 

    ... 

    cmd.ExecuteNonQuery(); //Is this command within transaction? 
    ... 
} 

Trả lời

9

Nó là một PHẢI để mở kết nối trong các TransactionScope để đảm bảo rằng kết nối được ghi danh trong giao dịch.

Điều này được tìm thấy trong nhận xét ngay trên connection.Open trong ví dụ this MSDN.

+2

có giải pháp nào để giải quyết vấn đề này trong giao dịch ngoài kết nối sql mở trong giao tác? Có thể phương pháp Enlist hữu ích về điều này không? – mkus

+3

mkus, vâng, bạn có thể sử dụng phương thức 'SqlConnection' instance' EnlistTransaction (Transaction.Current); 'để tranh thủ một kết nối đã mở trong một phạm vi giao dịch. Vì vậy, nói rằng * PHẢI * được mở trong TransactionScope là không đúng, mặc dù đó là cách cơ chế tự động được cho là được sử dụng. Ngoài ra, mở kết nối bên trong phạm vi thậm chí không đảm bảo kết nối sẽ được nhập ngũ, vì chuỗi kết nối có thể chỉ định "Enlist = false". Thông thường, tùy chọn đó không được chỉ định, nhưng đó là điều cần biết và kiểm tra. Xem http://stackoverflow.com/a/2886326/88409 – Triynko

5
  1. Không, lệnh không được thực hiện trong giao dịch
  2. mở kết nối bên trong phạm vi hoặc sử dụng phương pháp EnlistTransaction của SqlConnection dụ. Xem my answer in different thread.