read - set transaction isolation level snapshot in sql server
Cómo establecer el nivel de aislamiento en SqlCommand/SqlConnection inicializado sin transacción (5)
Agregue otro parámetro a su procedimiento almacenado para indicar el nivel de aislamiento con el que desea que se ejecute el procedimiento almacenado.
SI @isolevel = 0 AJUSTE EL NIVEL DE AISLAMIENTO DE TRANSACCIÓN leer sin confirmar; MÁS
También creo que no comprometido necesita dos "t" en él.
El siguiente método debe realizar una lectura sucia en una conexión abierta. No hay transacciones. ¿Dónde configuro IsolationLevel?
public string DoDirtyRead(string storedProcName, SqlConnection connection)
{
using (SqlCommand command = new SqlCommand(storedProcName, connection))
{
command.CommandType = CommandType.StoredProcedure;
// HOW TO SET IsolationLevel to READ_UNCOMMITTED here?
command.ExecuteNonQuery();
}
}
Dado que ya tiene una conexión existente (y posiblemente una transacción existente), usaría un TransactionScope para controlar el nivel de aislamiento del niño. Esto hace un conteo de filas de lectura sucia (creo):
using (var command = connection.CreateCommand())
using(new TransactionScope(TransactionScopeOption.RequiresNew, new TransactionOptions{IsolationLevel = IsolationLevel.ReadUncommitted}))
{
command.CommandText = string.Format("select count(*) from {0}", tableName);
return (int)command.ExecuteScalar();
}
En el método BeginTransaction: ( enlace MSDN )
Y si solo desea utilizar sugerencias en su SP a nivel de tabla, use WITH(NOLOCK) , pero WITH(NOLOCK) bajo su propio riesgo.
En su Procedimiento almacenado , para el uso de transact-sql :
SET TRANSACTION ISOLATION LEVEL read uncommitted -- 0
SET TRANSACTION ISOLATION LEVEL read committed -- 1
SET TRANSACTION ISOLATION LEVEL repeatable read -- 2
SET TRANSACTION ISOLATION LEVEL read serializable -- 3
Si no desea realizar transacciones, puede configurarlo una vez cuando abra la conexión y permanecerá en esa configuración hasta que la cambie. Así que hazlo:
connection.BeginTransaction(IsolationLevel.ReadUncommitted).Commit();
Probablemente no sea el mejor para su caso específico, ya que está abriendo la conexión, usándola y desechándola, pero quería incluir esta respuesta para cualquier persona con una conexión de mayor duración.