sql >> Databáze >  >> RDS >> Sqlserver

SQL Server:Úniky úrovně izolace mezi sdruženými připojeními

Před recyklací připojení volá fond připojení sp_resetconnection. Obnovení úrovně izolace transakcí není v seznamu věcí, které sp_resetconnection dělá. To by vysvětlovalo, proč „serializovatelný“ netěsní mezi sdruženými připojeními.

Myslím, že byste mohli začít každý dotaz tím, že se ujistíte, že je na správné úrovni izolace:

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

Další možnost:připojení s jiným připojovacím řetězcem nesdílejí fond připojení. Pokud tedy pro „serializovatelné“ dotazy použijete jiný připojovací řetězec, nebudou sdílet fond s dotazy „potvrzeno o čtení“. Snadný způsob, jak změnit připojovací řetězec, je použít jiné přihlášení. Můžete také přidat náhodnou možnost, jako je Persist Security Info=False; .

Nakonec byste se mohli ujistit, že každý „serializovatelný“ dotaz resetuje úroveň izolace, než se vrátí. Pokud se „serializovatelný“ dotaz nedokončí, můžete vymazat fond připojení a vynutit tak poškozené připojení z fondu:

SqlConnection.ClearPool(yourSqlConnection);

To je potenciálně drahé, ale neúspěšné dotazy jsou vzácné, takže byste neměli volat ClearPool() často.



  1. Vytváření plánů údržby v SQL Server

  2. Převést objekt SQL Server DateTime na BIGINT (.Net ticks)

  3. Jaký je rozdíl mezi INNER JOIN, LEFT JOIN, RIGHT JOIN a FULL JOIN?

  4. 2 způsoby, jak zřetězit řetězec a číslo v Oracle