uncommitted una transaction transacción transacciones transaccion repeatable read_uncommitted read pudo obtener niveles lectura las instantánea impresas estados datos convenciones aislamiento acceso c# sql sql-server-2005 transactions sqlconnection

c# - una - Nivel de aislamiento en Transacción Sql



set isolation level read uncommitted sql (4)

Implementé SqlTransaction en c # para comenzar, comprometer y retrotraer la transacción. Todo va bien, pero tengo algún problema al acceder a esas tablas que están conectadas durante la transacción. No pude leer la tabla durante la transacción (la tabla que está en la transacción). Mientras buscaba sobre esto, descubrí que sucede debido a un bloqueo exclusivo. Cualquier selección posterior en esos datos a su vez tiene que esperar a que se libere el bloqueo exclusivo. Luego, he SqlTransaction cada nivel de aislamiento proporcionado por SqlTransaction , pero no funcionó. Por lo tanto, debo liberar el bloqueo exclusivo durante la transacción para que otros usuarios puedan tener acceso a esa tabla y puedan leer los datos. ¿Hay algún método para lograr esto? Gracias por adelantado.

Aquí está mi código c # para la transacción

try { SqlTransaction transaction = null; using (SqlConnection connection=new SqlConnection(Connection.ConnectionString)) { connection.Open(); transaction=connection.BeginTransaction(IsolationLevel.Snapshot,"FaresheetTransaction"); //Here all transaction occurs if (transaction.Connection != null) { transaction.Commit(); transaction.Dispose(); } } } catch (Exception ex) { if (transaction.Connection != null) transaction.Rollback(); transaction.Dispose(); } `

Este código funciona bien, pero el problema es que cuando accedo a los datos de las tablas (los accedidos durante la transacción) durante el tiempo de la transacción. Se accede a las tablas por otras partes de la aplicación. Entonces, cuando traté de leer datos de la tabla, arroja una excepción.


El problema no está en el nivel de escritura en la base de datos sino en el nivel de valores de lectura. Está intentando leer valores que se están insertando. Intenta cambiar tu consulta de selección a la siguiente:

select * from your_table_with_inserts with (nolock)

sin embargo, esto anula el nivel de aislamiento de la transacción actual y puede causar lecturas sucias.

Entonces, la pregunta es: si está utilizando transacciones en todas las consultas o solo inserta / actualiza?


Intente ejecutar sus lecturas también dentro de una transacción y use el nivel de aislamiento READ UNCOMMITTED . Esto evitará que la lectura se bloquee, pero puede producir resultados no válidos:

SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED BEGIN TRANSACTION SELECT * FROM Table COMMIT TRANSACTION

Existe la idea errónea de que lidiar con las transacciones / niveles de aislamiento solo importa cuando se escribe, cuando en realidad es igualmente importante cuando se lee.


Una transacción SQL es, por diseño, ACID. En particular, es la "I" la que te está lastimando aquí; esto está diseñado para evitar que otras conexiones vean el estado intermedio inconsistente.

Una conexión de lectura individual puede optar por ignorar esta regla mediante el uso de la sugerencia NOLOCK , o el nivel de aislamiento READ UNCOMMITTED , pero parece que lo que desea es que la conexión de escritura no tome bloqueos. Bueno, eso no va a suceder.

Sin embargo, lo que podría ayudar es a los lectores a utilizar el aislamiento de instantáneas , que logra el aislamiento sin que el lector adopte bloqueos (al mirar, como su nombre indica, una instantánea puntual del estado consistente cuando se inició la transacción).

Sin embargo, IMO, sería mejor que observara:

  • transacciones múltiples, más granulares, del escritor
  • realizar el trabajo en una tabla de etapas (una copia paralela de los datos), luego fusionar eso en los datos reales en unas pocas operaciones de inserción masiva / actualización / eliminación, minimizando el tiempo de transacción

El primero es más simple.

El simple hecho es que si toma una transacción de larga duración que opera con una gran cantidad de datos, , va a estar causando problemas. Por eso no haces eso . El sistema está funcionando correctamente.


@ AKASH88, nivel de aislamiento SNAPSHOT es lo que está buscando.

Usted dice que incluso con SNAPSHOT no está funcionando como se esperaba, está ocurriendo el bloqueo exclusivo, puedo entender que tuve el mismo problema.

Asegúrese de no solo habilitar SNAPSHOT en las opciones de la base de datos, sino también READ COMMITTED SNAPSHOT debe estar activado.

Esto es SQL Server 2008, por lo que aún no está claro si esta respuesta ayudará :(

¡Atentamente!