Điều đó có nghĩa là gì khi một SqlConnection được "nhập ngũ" trong một giao dịch? Có phải nó chỉ đơn giản có nghĩa là các lệnh tôi thực hiện trên kết nối sẽ tham gia vào giao dịch?
Nếu vậy, trong trường hợp nào, một SqlConnection sẽ tự động được ghi danh vào một Giao dịch Giao dịch Kính viễn vọng xung quanh?
Xem câu hỏi trong ý kiến mã. Tôi đoán câu trả lời của mỗi câu hỏi theo sau mỗi câu hỏi trong ngoặc đơn.
Kịch bản 1: Mở kết nối TRONG phạm vi giao dịch
using (TransactionScope scope = new TransactionScope())
using (SqlConnection conn = ConnectToDB())
{
// Q1: Is connection automatically enlisted in transaction? (Yes?)
//
// Q2: If I open (and run commands on) a second connection now,
// with an identical connection string,
// what, if any, is the relationship of this second connection to the first?
//
// Q3: Will this second connection's automatic enlistment
// in the current transaction scope cause the transaction to be
// escalated to a distributed transaction? (Yes?)
}
Kịch bản 2: Sử dụng các kết nối TRONG phạm vi giao dịch đã được mở NGOÀI TRỜI
//Assume no ambient transaction active now
SqlConnection new_or_existing_connection = ConnectToDB(); //or passed in as method parameter
using (TransactionScope scope = new TransactionScope())
{
// Connection was opened before transaction scope was created
// Q4: If I start executing commands on the connection now,
// will it automatically become enlisted in the current transaction scope? (No?)
//
// Q5: If not enlisted, will commands I execute on the connection now
// participate in the ambient transaction? (No?)
//
// Q6: If commands on this connection are
// not participating in the current transaction, will they be committed
// even if rollback the current transaction scope? (Yes?)
//
// If my thoughts are correct, all of the above is disturbing,
// because it would look like I'm executing commands
// in a transaction scope, when in fact I'm not at all,
// until I do the following...
//
// Now enlisting existing connection in current transaction
conn.EnlistTransaction( Transaction.Current );
//
// Q7: Does the above method explicitly enlist the pre-existing connection
// in the current ambient transaction, so that commands I
// execute on the connection now participate in the
// ambient transaction? (Yes?)
//
// Q8: If the existing connection was already enlisted in a transaction
// when I called the above method, what would happen? Might an error be thrown? (Probably?)
//
// Q9: If the existing connection was already enlisted in a transaction
// and I did NOT call the above method to enlist it, would any commands
// I execute on it participate in it's existing transaction rather than
// the current transaction scope. (Yes?)
}