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

Este código simple produce interbloqueo. Programa de ejemplo simple incluido

Sus dos declaraciones adquieren bloqueos de fila en orden diferente. Ese es un caso clásico de puntos muertos. Puede solucionar esto asegurándose de que el orden de los bloqueos tomados siempre esté en algún orden global (por ejemplo, ordenado por ID). Probablemente debería unir los dos UPDATE sentencias en una y ordene la lista de ID en el cliente antes de enviarla a SQL Server. Para muchos típicos UPDATE planes, esto realmente funciona bien (aunque no está garantizado).

O bien, agrega lógica de reintento en caso de que detecte un interbloqueo (SqlException.Number == 1205 ). Esto es más elegante porque no requiere cambios de código más profundos. Pero los interbloqueos tienen implicaciones en el rendimiento, así que solo haga esto para tasas de interbloqueo bajas.

Si su procesamiento paralelo genera muchas actualizaciones, podría INSERT todas esas actualizaciones en una tabla temporal (que se puede hacer al mismo tiempo) y cuando haya terminado, ejecute una gran UPDATE que copia todos los registros de actualización individuales en la tabla principal. Simplemente cambie la fuente de unión en sus consultas de muestra.