Respuestas:
SQL Server normalmente utiliza una estrategia de bloqueo diferente a la de Oracle. La estrategia predeterminada utilizada por SQL Server significa que al seleccionar filas se bloquean las lecturas (en filas, páginas o toda la tabla) *. Por lo tanto, a NOLOCK
veces es una cláusula útil, aunque el consejo general es nunca usarla, ya que cambia la semántica de los niveles de aislamiento y puede causar resultados inconsistentes en la salida de las consultas.
* (Nota: ese es el valor predeterminado. Si SNAPSHOT
se elige el aislamiento, el comportamiento es diferente y los lectores no bloquean a los escritores).
En Oracle, un proceso de lectura nunca bloqueará un proceso de escritura. Lo siguiente es un extracto de ' Oracle Database Concepts 11g Release 2 '. Le recomiendo que eche un vistazo si está interesado en cómo Oracle maneja esto.
Concurrencia de datos y consistencia
Resumen del comportamiento de bloqueo
La base de datos mantiene varios tipos diferentes de bloqueos, dependiendo de la operación que adquirió el bloqueo. En general, la base de datos utiliza dos tipos de bloqueos: bloqueos exclusivos y bloqueos compartidos. Solo se puede obtener un bloqueo exclusivo en un recurso, como una fila o una tabla, pero muchos bloqueos compartidos se pueden obtener en un solo recurso.
Las cerraduras afectan la interacción de lectores y escritores. Un lector es una consulta de un recurso, mientras que un escritor es una declaración que modifica un recurso. Las siguientes reglas resumen el comportamiento de bloqueo de Oracle Database para lectores y escritores:
• Una fila está bloqueada solo cuando es modificada por un escritor.
Cuando una declaración actualiza una fila, la transacción adquiere un bloqueo solo para esta fila. Al bloquear los datos de la tabla a nivel de fila, la base de datos minimiza la contención por los mismos datos. En circunstancias normales 1, la base de datos no escala un bloqueo de fila al nivel de bloque o tabla.
• Un escritor de una fila bloquea a un escritor concurrente de la misma fila.
Si una transacción está modificando una fila, entonces un bloqueo de fila evita que una transacción diferente modifique la misma fila simultáneamente.
• Un lector nunca bloquea a un escritor.
Como el lector de una fila no la bloquea, un escritor puede modificar esta fila. La única excepción es una instrucción SELECT ... FOR UPDATE, que es un tipo especial de instrucción SELECT que bloquea la fila que está leyendo.
• Un escritor nunca bloquea a un lector.
Cuando un escritor cambia una fila, la base de datos utiliza datos de deshacer para proporcionar a los lectores una vista coherente de la fila.