Il pool di connessioni chiama sp_resetconnection prima di riciclare una connessione. La reimpostazione del livello di isolamento della transazione non è nell'elenco delle operazioni eseguite da sp_resetconnection. Questo spiegherebbe perché le perdite "serializzabili" tra le connessioni in pool.
Immagino che potresti iniziare ogni query assicurandoti che sia al giusto livello di isolamento:
if not exists (
select *
from sys.dm_exec_sessions
where session_id = @@SPID
and transaction_isolation_level = 2
)
set transaction isolation level read committed
Un'altra opzione:le connessioni con una stringa di connessione diversa non condividono un pool di connessioni. Quindi, se utilizzi un'altra stringa di connessione per le query "serializzabili", non condivideranno un pool con le query "read commit". Un modo semplice per modificare la stringa di connessione consiste nell'utilizzare un login diverso. Puoi anche aggiungere un'opzione casuale come Persist Security Info=False;
.
Infine, puoi assicurarti che ogni query "serializzabile" reimposti il livello di isolamento prima che venga restituito. Se una query "serializzabile" non viene completata, puoi cancellare il pool di connessioni per forzare l'uscita dal pool della connessione contaminata:
SqlConnection.ClearPool(yourSqlConnection);
Questo è potenzialmente costoso, ma le query non riuscite sono rare, quindi non dovresti dover chiamare ClearPool()
spesso.