Sqlserver
 sql >> Database >  >> RDS >> Sqlserver

Deadlock su SELECT/UPDATE

Non è sufficiente avere una transazione serializzabile, è necessario suggerire il blocco affinché funzioni.

Il livello di isolamento serializzabile di solito acquisirà comunque il tipo di blocco "più debole" possibile che garantisce il rispetto delle condizioni serializzabili (letture ripetibili, nessuna riga fantasma, ecc.)

Quindi, stai afferrando un blocco condiviso sul tuo tavolo che in seguito (nella transazione serializzabile) stai tentando di eseguire l'aggiornamento a un blocco di aggiornamento. L'aggiornamento avrà esito negativo se un altro thread detiene il blocco condiviso (funzionerà se nessun altro corpo detiene un blocco condiviso).

Probabilmente vorrai cambiarlo come segue:

SELECT * FROM SessionTest with (updlock) WHERE SessionId = @SessionId

Ciò garantirà l'acquisizione di un blocco di aggiornamento quando viene eseguita la SELEZIONE (quindi non sarà necessario aggiornare il blocco).