5

Estoy ejecutando varias inserciones utilizando transacciones. Estoy usando la clase SqlDependency para informar al equipo cliente cuándo se ha actualizado el servidor.Notificación SQL compatible con niveles de aislamiento para transacciones

El problema que tengo es que cada vez que inserto usando una transacción, independientemente del nivel de aislamiento que establezca para la transacción, SqlNotificationEventArgs devuelve e.Info como aislamiento, lo que indica que tengo el nivel de aislamiento incorrecto establecido para esas transacciones (Creo). Cuando inserto sin usar una transacción, todo funciona sin problemas.

Mi pregunta es, ¿cuáles son los niveles de aislamiento admitidos, si existen, para las transacciones cuando se usa la notificación SQL?

A continuación se muestra una parte del código que estoy utilizando para la notificación:

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); 
     } 
    } 
} 

Y para la transacción:

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(); 
} 

Editar: cometía la transacción en el lugar equivocado.

Respuesta

2

Parece que la notificación de consulta no admite transacciones. Eliminar el código de transacción solucionó este problema.

Según Microsoft:

Transact-SQL no proporciona una forma de suscribirse para recibir notificaciones. Las clases de acceso a datos CLR alojadas en SQL Server no admiten notificaciones de consulta.

Esta cita se encontró en http://msdn.microsoft.com/en-us/library/ms188669.aspx, que describe cómo funcionan las notificaciones de consulta y sus requisitos.

Cuestiones relacionadas