sql >> Base de Datos >  >> RDS >> Sqlserver

SQL Server:prevención de lecturas sucias en un procedimiento almacenado

No puedes evitar las lecturas sucias. Los escritores toman bloqueos exclusivos para evitar lecturas honestas y comprometidas. Pero no hay nada puede hacer para evitar lecturas sucias. El lector sucio tiene que dejar de hacer lecturas sucias, punto.

Suponiendo que el código que sondea la tabla Cliente está bajo su control, la solución es eliminar la sugerencia de lectura sucia de la consulta. Esto probablemente causará controversia, ya que ahora el sondeo bloqueará las escrituras. La mejor solución para eso es habilitar versión de filas :

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

Luego, simplemente sondee al Cliente como una consulta normal, sin sugerencias. Su encuesta no bloqueará las escrituras posteriores, ya que el control de versiones de filas se activará y redirigirá el análisis de consultas a una versión de la fila previa a la actualización y no bloqueada.

Una nota más:¿sondeo cada 500 ms? Tal vez debería usar un mecanismo de notificación de consulta para invalidar sus cachés, consulte The Mysterious Notificación .