5

Tôi đang chạy nhiều lần chèn bằng cách sử dụng các giao dịch. Tôi đang sử dụng lớp SqlDependency để cho máy khách biết khi máy chủ đã được cập nhật. Vấn đề tôi gặp phải là bất cứ khi nào tôi chèn bằng cách sử dụng một giao dịch, bất kể mức độ cách ly tôi đặt cho giao dịch là gì, SqlNotificationEventArgs trả về e.Info là Cách ly cho biết rằng tôi đã đặt mức cách ly sai cho các giao dịch đó (Tôi nghĩ). Khi tôi chèn mà không sử dụng một giao dịch, tất cả mọi thứ chạy trơn tru.Thông báo về mức độ cô lập được hỗ trợ bởi Sql cho các giao dịch

Câu hỏi của tôi là, mức độ cách ly được hỗ trợ, nếu có, cho các giao dịch khi sử dụng thông báo Sql?

Dưới đây là một số mã tôi đang sử dụng cho thông báo:

void DataChanged(object sender, SqlNotificationEventArgs e) { 
    var i = (ISynchronizeInvoke)_form; 
    if (i.InvokeRequired) { 
     var tempDelegate = new OnChangeEventHandler(DataChanged); 
     object[] args = { sender, e }; 
     i.BeginInvoke(tempDelegate, args); 
    } else { 
     var dependency = (SqlDependency)sender; 
     if (e.Type == SqlNotificationType.Change) { 
      dependency.OnChange -= DataChanged; 
      GetData(dependency); 
     } 
    } 
} 

Và đối với những giao dịch:

public void ExecuteNonQueryData(List<string> commandTexts) { 
    SqlConnection connection = null; 
    var command = new SqlCommand(); 
    SqlTransaction transaction = null; 
    try { 
     connection = new SqlConnection(GetConnectionString()); 
     connection.Open(); 
     transaction = connection.BeginTransaction(IsolationLevel.ReadCommitted); 
     foreach (var commandText in commandTexts) { 
      try { 
       command.Connection = connection; 
       command.CommandText = commandText; 
       command.Transaction = transaction; 
       command.ExecuteNonQuery(); 
      } catch (Exception ex) { 
       Console.WriteLine(ex.Message); 
      } 
     } 
     transaction.Commit(); 
    } catch (Exception ex) { 
     Console.WriteLine(ex.Message); 
    } finally { 
     command.Dispose(); 
     if (transaction != null) transaction.Dispose(); 
     if (connection != null) { 
      connection.Close(); 
      connection.Dispose(); 
     } 
    } 
    commandTexts.Clear(); 
} 

Edit: Tôi đã cam kết giao dịch tại địa điểm sai.

Trả lời

2

Dường như Thông báo truy vấn không hỗ trợ giao dịch. Việc xóa mã giao dịch đã khắc phục sự cố này.

Theo Microsoft:

Transact-SQL không cung cấp một cách để đăng ký thông báo. Các lớp truy cập dữ liệu CLR được lưu trữ trong SQL Server không hỗ trợ thông báo truy vấn.

Trích dẫn này được tìm thấy tại http://msdn.microsoft.com/en-us/library/ms188669.aspx, mô tả cách hoạt động của Thông báo truy vấn và các yêu cầu của chúng.

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