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.