uncommitted transaction sucia read_committed_snapshot read niveles lectura committed aislamiento c# sql-server transactions ado.net

c# - transaction - read_committed_snapshot



¿Qué nivel de aislamiento utiliza la transacción de autoconexión en SQL Server? (1)

No hay un nivel de aislamiento específico para las transacciones de autocomment. Utilizan cualquier nivel de aislamiento que haya sido declarado por última vez para una conexión (o el servidor predeterminado).

Desafortunadamente, sin embargo, de cara a la agrupación de conexiones 1 , lo que usted considera una conexión "nueva" puede ser, de hecho, una conexión reutilizada. Por lo tanto, en algunas circunstancias, seleccionará una conexión que utiliza un nivel de aislamiento diferente al predeterminado de SQL Server (Read Committed).

Mi consejo sería: si utiliza niveles de aislamiento explícitos en cualquier lugar, también debe asegurarse de utilizar una cadena de conexión diferente , o debe desactivar la agrupación de conexiones, si no desea establecer explícitamente el nivel de aislamiento en todas partes . Por lo general, prefiero el primero, de modo que aún puede beneficiarse de la agrupación de conexiones, pero tiene grupos separados para cada nivel de aislamiento requerido.

1 Problema de conexión que parece indicar que esto puede o no ser cierto para SQL Server 2014 y posterior.

Cuando trabajo con el problema de actualización de conflictos con SNAPSHOT Isolation Level, parece que las transacciones de autocommit utilizan el nivel de aislamiento utilizado por última vez.

Condición: ALLOW_SNAPSHOT_ISOLATION está activado, READ_COMMITTED_SNAPSHOT está desactivado

Paso 1: Ejecutar instrucción de actualización sin transacción

using (var sqlconn = new SqlConnection("Data source=...")) using (var sqlcmd = sqlconn.CreateCommand()) { sqlconn.Open(); sqlcmd.CommandText = "Update ..." sqlcmd.ExecuteNonQuery(); }

Luego eché un vistazo en sys.md_exec_sessions y encontré que el nivel de aislamiento de la transacción es READCOMMITTED .

Paso 2: Ejecute la instrucción de actualización con la transacción en el nivel de aislamiento SNAPSHOT

using (var sqlconn = new SqlConnection("Data source=...")) { sqlconn.Open(); using (var sqltran = sqlconn.BeginTransaction(IsolationLevel.Snapshot)) using (var sqlcmd = sqlconn.CreateCommand()) { sqlconn.Open(); sqlcmd.CommandText = "Update ..." sqlcmd.ExecuteNonQuery(); } }

El nivel de aislamiento es Snapshot , funciona bien.

Paso 3: haz el paso 1 otra vez

El nivel de aislamiento es Snapshot . Espero que el paso 3 muestre READCOMMITTED porque READ_COMMITTED_SNAPSHOT está desactivado.

Hay dos ideas que supongo, pero no puedo concluir.

  1. dm_exec_sessions no contiene información sobre las transacciones de autocommit
  2. la transacción de autocompra realmente usa SNAPSHOT

Cualquier idea será apreciada.

Gracias,