2009-06-01 8 views
12

Tôi có một số mã hoạt động giống như việc sử dụng thông báo của TransactionScope, nhưng có một kết nối môi trường xung quanh thay vì một giao dịch môi trường xung quanh.Có cách nào để sử dụng TransactionScope với kết nối hiện có không?

Có cách nào để sử dụng đối tượng TransactionScope có kết nối hiện có hay không, hoặc có thay thế trong khuôn khổ .Net cho mục đích này không?

Trả lời

25

Thực tế, có một cách.

connection.EnlistTransaction(Transaction.Current) 

Nó hoạt động và nó không thúc đẩy giao dịch để phân phối nếu không cần thiết (trái với những gì tài liệu nói)

HTH

4

Để tranh thủ kết nối vào một TransactionScope, bạn cần chỉ định 'Enlist=true' trong chuỗi kết nối của nó và mở kết nối trong phạm vi đối tượng TransactionScope đó.

Bạn có thể sử dụng SqlConnection.BeginTransaction trên kết nối hiện có.

Cập nhật: Bạn có thể sử dụng BeginTransaction như thế này:

using (SqlConnection connection = new SqlConnection(connectionString)) 
{ 
    connection.Open(); 

    SqlCommand command = connection.CreateCommand(); 
    SqlTransaction transaction; 

    // Start a local transaction. 
    transaction = connection.BeginTransaction("SampleTransaction"); 

    // Must assign both transaction object and connection 
    // to Command object for a pending local transaction 
    command.Connection = connection; 
    command.Transaction = transaction; 

    ... 
    ... 

} 
+0

Có điều là, khi kết nối được mở trước instantiation TransactionScope; do đó lý do cho câu hỏi của tôi. –

+0

@Mitch, Không phải là kết nối.BeginTransaction ("SampleTransaction") quảng bá cho một giao dịch phân tán (DTC) trong bất kỳ kịch bản nào? Nếu có, thì các kịch bản đó là gì? – Baig

3

Sau khi nghiên cứu nhiều hơn, câu trả lời cho câu hỏi của tôi hóa ra là:

Không, kết nối cần phải được mở ra sau khi Đối tượng TransactionScope được khởi tạo.