Sqlserver
 sql >> Datenbank >  >> RDS >> Sqlserver

SQL Server:Dirty Reads in einer gespeicherten Prozedur verhindern

Sie können Dirty Reads nicht verhindern. Writer verwenden exklusive Sperren, um ehrliche Lesevorgänge zu verhindern. Aber da ist nichts was Sie tun können, um Dirty Reads zu verhindern. Der Dirty Reader muss aufhören Dirty Reads zu machen, Punkt.

Unter der Annahme, dass der Code, der die Customer-Tabelle abfragt, unter Ihrer Kontrolle steht, besteht die Lösung darin, den Dirty-Read-Hinweis aus der Abfrage zu entfernen. Dies wird wahrscheinlich zu Konflikten führen, da die Abfrage jetzt die Schreibvorgänge blockiert. Die beste Lösung dafür ist die Aktivierung der Zeilenversionierung :

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

Dann fragen Sie den Kunden einfach als normale Abfrage ab, ohne Hinweise. Ihre Umfrage blockiert nicht hinter Schreibvorgängen, da die Zeilenversionierung einsetzt und den Abfragescan auf eine nicht gesperrte Version der Zeile vor der Aktualisierung umleitet.

Noch eine Anmerkung:Polling alle 500ms? Vielleicht sollten Sie einen Abfragebenachrichtigungsmechanismus verwenden, um Ihre Caches ungültig zu machen, siehe The Mysterious Benachrichtigung .