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.