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

SQL Server:prevenzione di letture sporche in una stored procedure

Non puoi evitare letture sporche. Gli scrittori prendono blocchi esclusivi per impedire letture oneste, impegnate. Ma non c'è niente puoi fare per evitare letture sporche. Il lettore sporco deve smettere di fare letture sporche, punto.

Supponendo che il codice che esegue il polling della tabella Customer sia sotto il tuo controllo, la soluzione consiste nel rimuovere il suggerimento di lettura sporca dalla query. Ciò probabilmente causerà contese, poiché il polling ora bloccherà le scritture. La soluzione migliore è abilitare il row versioning :

ALTER DATABASE [<DBNAME>] SET ALLOW_SNAPSHOT_ISOLATION ON; 
ALTER DATABASE [<DBNAME>] SET READ_COMMITTED_SNAPSHOT ON;

Quindi è sufficiente eseguire il polling dal Cliente come una normale query, senza alcun suggerimento. Il tuo sondaggio non si bloccherà dietro le scritture poiché il controllo delle versioni delle righe si avvierà e reindirizzerà la scansione della query a una versione pre-aggiornamento e non bloccata della riga.

Un'altra nota:polling ogni 500 ms? Forse dovresti usare un meccanismo di notifica delle query per invalidare le tue cache, vedi The Mysterious Notifica .