sql >> Base de Datos >  >> RDS >> Sqlserver

SQL Server:fugas de nivel de aislamiento en conexiones agrupadas

El grupo de conexiones llama a sp_resetconnection antes de reciclar una conexión. Restablecer el nivel de aislamiento de transacciones no está en la lista de cosas que hace sp_resetconnection. Eso explicaría por qué las fugas "serializables" en las conexiones agrupadas.

Supongo que podría comenzar cada consulta asegurándose de que esté en el nivel de aislamiento correcto:

if not exists (
              select  * 
              from    sys.dm_exec_sessions 
              where   session_id = @@SPID 
                      and transaction_isolation_level = 2
              )
    set transaction isolation level read committed

Otra opción:las conexiones con una cadena de conexión diferente no comparten un grupo de conexiones. Entonces, si usa otra cadena de conexión para las consultas "serializables", no compartirán un grupo con las consultas de "lectura confirmada". Una manera fácil de modificar la cadena de conexión es usar un inicio de sesión diferente. También puede agregar una opción aleatoria como Persist Security Info=False; .

Finalmente, puede asegurarse de que cada consulta "serializable" restablezca el nivel de aislamiento antes de que regrese. Si una consulta "serializable" no se completa, puede borrar el grupo de conexiones para forzar la conexión corrupta fuera del grupo:

SqlConnection.ClearPool(yourSqlConnection);

Esto es potencialmente costoso, pero las consultas fallidas son raras, por lo que no debería tener que llamar a ClearPool() a menudo.