Cuando ejecuta las dos declaraciones al mismo tiempo (un SELECT y una ACTUALIZACIÓN) el comportamiento real será básicamente aleatorio. Esto es porque ninguna de las operaciones es instantánea. Para simplificar, considere su tabla una lista y SELECCIONAR está atravesando esta lista, mirando una fila a la vez. ACTUALIZAR también está tratando de actualizar una o más filas. Cuando la actualización está tratando de actualizar una fila detrás de SELECT, no ocurre nada (sin bloqueo) porque el SELECT ya ha progresado más allá del punto de ACTUALIZACIÓN. Si la actualización está tratando de actualizar la fila en la que SELECT está buscando en este momento, entonces la actualización tendrá que esperar que SELECT continúe, lo que ocurrirá muy, muy muy rápido y la actualización se desbloqueará y tendrá éxito, mientras que SELECT está avanzando. Pero si la ACTUALIZACIÓN está actualizando una fila adelante del SELECTO entonces la actualización tendrá éxito y, más tarde, SELECCIONARÁ finalmente llegará exactamente a esta fila y se detendrá, bloqueado.Ahora SELECT tiene que esperar hasta que la transacción que realizó UPDATE confirme.
Esta es la historia simplificada. La vida real es mucho más complicada. El SELECCIONAR puede tener puntos de lectura múltiples (planes paralelos). Tanto el SELECCIONAR como la ACTUALIZACIÓN están sujetas a elegir una ruta de acceso, es decir, usar uno o más índices secundarios para ubicar las filas. Las consultas complejas pueden contener operadores que causan búsquedas múltiples en una tabla (por ejemplo, uniones). Tanto SELECT como UPDATE pueden hacer búsquedas en los marcadores para obtener datos BLOB, lo que cambia significativamente el comportamiento de bloqueo. La estimación de cardinalidad puede hacer que SELECT se ejecute en un modo de bloqueo de granularidad alta (por ejemplo, bloqueo compartido de nivel de tabla). La ACTUALIZACIÓN puede desencadenar escalada de bloqueo y la escalada puede fallar o tener éxito. Choosing different access paths can lead to deadlock. False lock contention can occur due to hash collisions. Hay casi una miríada de variables que tienen voz en esto. Y ni siquiera mencioné niveles de aislamiento más altos (lectura repetible, serializable).
Quizás debería usar el aislamiento SNAPSHOT y dejar de preocuparse por este problema?
¿De qué nivel de aislamiento de transacción está hablando? – Oded
@Oded El valor predeterminado: creo que se ha leído. –
* "actualmente no me importan los datos sucios" *: tenga cuidado [lo que desea] (http://blogs.msdn.com/b/sqlcat/archive/2007/02/01/previously-committed- rows-might-be-missed-if-nolock-hint-is-used.aspx). –