Hola a todos, estas últimas semanas estamos teniendo varias incidencias por bloqueos en algunos clientes, así que vamos a aprovechar y revisar como se realiza la gestión de concurrencia de datos en Oracle.
Gestión de concurrencia de datos
La gestión de concurrencia de datos es un aspecto importante en los sistemas de bases de datos multiusuario. Hay que garantizar que las transacciones se realicen de manera segura y coherente, ya que puede haber varios usuarios intentando acceder al mismo tiempo al mismo dato. Oracle utiliza varios mecanismos para gestionar la concurrencia y mantener la integridad de los datos.
- Bloqueos. Oracle utiliza bloqueos para controlar el acceso a los datos. Los bloqueos pueden ser a nivel de fila o de tabla y pueden ser compartidos o exclusivos, dependiendo de la operación que se esté realizando.
- Versionado de los datos. Oracle implementa el control de concurrencia multiversión, que permite a los usuarios ver una versión consistente de los datos mientras se realizan cambios en otras transacciones. Esto se logra mediante el uso de undo segments que almacenan versiones anteriores de los datos.
- Niveles de Aislamiento. Oracle soporta varios niveles de aislamiento de transacciones, como Read Committed y Serializable, que determinan cómo y cuándo los cambios de una transacción son visibles para otras.
Nos vamos a centrar en los bloqueos
Tipos de bloqueos
En Oracle podemos encontrar 5 tipos de bloqueos a nivel de tabla.
Bloqueo Compartido (S)
permite que múltiples transacciones lean una tabla simultáneamente, pero impide que cualquier transacción modifique la tabla mientras el bloqueo está en efecto. Este tipo de bloqueo es útil cuando necesitas asegurar que los datos no cambien mientras se están leyendo, garantizando así la consistencia de los datos durante las operaciones de lectura. Es un bloqueo que se suele utilizar para realizar informes cuando los datos no pueden cambiar mientras se realice el informe.
La sintaxis de este tipo de bloqueos es:
LOCK TABLE employees IN SHARE MODE;
En el ejemplo se puede ver que la segunda sesión puede ejecutar una SELECT, pero al intentar modificar, en este ejemplo con un UPDATE, se queda esperando a que la primera sesión termine. La sesión bloqueadora termina cuando se asegura la transacción (COMMIT) o se revierte la misma (ROLLBACK).
Bloqueo Exclusivo (X)
Impide que otras transacciones lean o modifiquen la tabla o las filas bloqueadas. Este tipo de bloqueo se utiliza cuando una transacción necesita acceso exclusivo a los datos para realizar modificaciones, asegurando que ninguna otra transacción interfiera durante el proceso.
La sintaxis de este tipo de bloqueos es:
LOCK TABLE employees IN EXCLUSIVE MODE;
En el ejemplo se puede ver que la segunda sesión puede ejecutar una SELECT pero esta se queda en espera hasta que se libere el bloqueo por la primera transacción.
Bloqueo Compartido de Fila (RS)
Permite que múltiples transacciones lean una tabla y bloquea las filas seleccionadas para evitar modificaciones. Este tipo de bloqueo es útil cuando necesitas asegurar que los datos no cambien mientras se están leyendo, pero quieres permitir que otras transacciones también puedan leer la tabla.
La sintaxis de este tipo de bloqueos es:
LOCK TABLE employees IN ROW SHARE MODE;
Aparte de la sintaxis de LOCK TABLE, este tipo de bloqueos se generan también cuando se lanzan comandos SELECT FOR UPDATE. En el ejemplo se puede observar que se bloquean las filas cuyo department_id=10 en la primera sesión, y se permite a la segunda sesión realizar SELECT sin problemas, y realizar UPDATE sobre filas del department_id=20 mientras que el UPDATE sobre las filas de department_id=10 se queda en espera a que se libere el bloqueo.
Bloqueo Exclusivo de Fila (RX)
Permite que una transacción tenga acceso exclusivo a las filas seleccionadas para realizar modificaciones. Este tipo de bloqueo asegura que ninguna otra transacción pueda leer o modificar las filas bloqueadas hasta que la transacción se complete.
La sintaxis de este tipo de bloqueos es:
LOCK TABLE employees IN ROW EXCLUSIVE MODE;
Además de la sentencia LOCK TABLE, este tipo de bloqueos se generan con las sentencias DML sobre las filas afectadas. En el ejemplo se aprecia que si se cambia el salario del usuario con employee_id=120 en la sesión 1, desde la sesión 2 no se aprecia el cambio al ejecutar la SELECT, y no se puede modificar con otro UPDATE sobre la misma fila.
Bloqueo Compartido de Fila Exclusiva (SRX)
Permite que una transacción tenga acceso exclusivo a las filas seleccionadas para realizar modificaciones, mientras permite que otras transacciones lean la tabla. Este tipo de bloqueo es más restrictivo que un bloqueo compartido (S) pero menos restrictivo que un bloqueo exclusivo (X).
La sintaxis de este tipo de bloqueos es:
LOCK TABLE employees IN SHARE ROW EXCLUSIVE MODE;
En este caso el ejemplo sería el mismo que en el tipo de bloqueo anterior.
Cómo consultar los bloqueos en Oracle
Hay varias vistas del diccionario de datos de Oracle que nos permiten revisar que bloqueos hay en la BBDD y los objetos afectados por esos bloqueos.
- V$LOCK. Muestra información sobre todos los bloqueos en la base de datos.
- V$SESSION. Proporciona detalles sobre las sesiones actuales, incluyendo las que están bloqueando o esperando.
- V$LOCKED_OBJECT. Muestra información sobre los objetos bloqueados.
- DBA_LOCK. Proporciona información detallada sobre los bloqueos, incluyendo el tipo de bloqueo y el modo.
- DBA_BLOCKERS. Permite identificar qué sesiones están bloqueando.
- DBA_WAITERS. Permite identificar qué sesiones están esperando.
En todas ellas solamente se puede revisar el bloqueo mientras esté activo. En el momento en que el bloqueo termina deja de estar presente en las vistas del diccionario.
Esperamos que os haya resultado de utilidad. No dudéis en poneros en contacto con nosotros en caso de necesitar ayuda en la gestión de vuestras bases de datos. Échale un vistazo a nuestros servicios de soporte y mantenimiento Oracle.
¿Aún no conoces Query Performance? Descubre cómo puede ayudarte en tu entorno Oracle. Más información en su página de LinkedIn.
Sígue a GPS en LinkedIn