Bloqueos mutuos en una base de datos DB2
La configuración de la base de datos para reducir el contenido de E/S en el disco ayuda a reducir los bloqueos mutuos. Sin embargo, es posible que la ejecución del procedimiento almacenado new_edit_state produzca bloqueos mutuos en la aplicación invocada y bloquee los demás usos de la base de datos.
Imagine una situación en la que el procedimiento almacenado adquiere una gran cantidad de bloqueos de fila en la tabla STATE_LINEAGES, que supera el umbral de cantidad máxima y que tiende a escalar a un bloqueo de tabla exclusivo. Lamentablemente, la consulta de la aplicación que se invoca ya cuenta con un bloqueo compartido en la tabla STATE_LINEAGES, lo que producirá un bloqueo mutuo. Se producirán grandes cantidades de bloqueos de fila por tener un amplio linaje de estado. Esto, sumado a que se cuenta con una configuración limitada para el tamaño de la lista de bloqueo, garantiza que habrá problemas. Pueden darse otras situaciones de bloqueos mutuos, debido al modo de control de la extensión de bloqueos.
Esto quiere decir que los bloqueos mutuos pueden ser comunes en algunos sitios, lo que depende de cada aplicación y de la configuración de la base de datos. Una vez más, tenga en cuenta que el problema puede agravarse con linajes de estados amplios.
Afortunadamente, IBM DB2 brinda parámetros de ajuste para controlar el tamaño de la lista de bloqueo (LOCKLIST), el porcentaje máximo de bloqueos que puede mantener una aplicación (MAXLOCKS), la cantidad de tiempo que una solicitud espera antes de que se adquiera un bloqueo (LOCKTIMEOUT), el intervalo de frecuencia para la detección de bloqueos mutuos (DLCHKTIME) y el comportamiento de reversión de los bloqueos mutuos (DB2LOCK_TO_RB).
Rápidamente, para aumentar la capacidad de la lista de bloqueo y el umbral de extensión de bloqueo, modifique los parámetros LOCKLIST y MAXLOCKS respectivamente.
El valor predeterminado para LOCKLIST y MAXLOCKS en DB2 9 es AUTOMATIC, lo que permite el ajuste automático de estos parámetros. Esto permite que el regulador de memoria de DB2 le de tamaño de manera dinámica a los recursos de memoria de los diferentes consumidores de esta. El ajuste automático se produce sólo cuando la memoria con esta función está habilitada en la base de datos (SELF_TUNING_MEM=ON).
Además, puede mejorar la concurrencia a través de la prevención de bloqueos. Para ello debe utilizar las variables de registro de aplazamiento de bloqueos de DB2: DB2_EVALUNCOMMITED, DB2_SKIPDELETED y DB2_SKIPINSERTED. Estas variables permiten que se salteen las eliminaciones e inserciones no confirmadas durante el escaneo.
Por defecto, un tiempo de espera de bloqueo elimina la transacción de solicitud. Para modificar este comportamiento a fin de que revierta sólo la declaración que realiza la solicitud de bloqueo, modifique el parámetro DB2LOCK_TO_RB con el comando db2set DB2LOCK_TO_RB=STATEMENT. Sin embargo, el comportamiento predeterminado debería funcionar bien para ArcSDE.
Consulte las guías de ajustes de rendimiento o la documentación de DB2 para obtener información detallada sobre la configuración adecuada de estos parámetros. A continuación se presenta una vista general del uso de estos parámetros.
Realizar un diagnóstico de los problemas de bloqueo
A continuación se detallan algunas de las herramientas útiles para diagnosticar problemas de bloqueo.
- Busque las Id. de aplicación de db2 para procesos SDE.
SELECT appl_id FROM TABLE(SNAPSHOT_APPL_INFO('SDE',-1)) AS SNAPSHOT_APPL_INFO WHERE appl_name LIKE 'gsrvr%' SELECT appl_id,appl_name FROM TABLE(SNAPSHOT_APPL_INFO('SDE',-1))
- Para la información de aplicaciones y bloqueos, utilice instantáneas. Por ejemplo:Una búsqueda rápida de elementos de interés en el resultado de la instantánea produce lo siguiente:
db2 get snapshot for locks on sde > all_locks.txt db2 get snapshot for locks for application applid '*LOCAL.DB2.00AB42215335' > app_locks.txt db2 get snapshot for application applid '*LOCAL.DB2.00AB42215335' > app_info.txt
Application status = Lock-wait Locks held by application = 1254 Number of SQL requests since last commit = 12 Open local cursors = 1 Most recent operation = Execute Object type = Table Tablespace name = USERSPACE1 Table schema = SDE Table name = STATE_LINEAGES Mode = X Status = Converting Current mode = IX Lock escalation = YES
- Como se explicó anteriormente, los linajes amplios pueden resultar problemáticos cuando se adquiere una gran cantidad de bloqueos de fila. Las instrucciones SQL que se presentan a continuación pueden brindar una rápida verificación de las amplitudes de linaje y de su límite de amplitud:
SELECT COUNT (*) FROM state_lineages GROUP BY lineage_name SELECT MAX(a.depth) FROM (SELECT COUNT (*) FROM state_lineages GROUP BY lineage_name) a(depth)
Configuración de parámetros que tratan los bloqueos mutuos
Para ver la configuración de la lista de bloqueo, ejecute el siguiente comando:
db2 get db cfg
A continuación se presenta un ejemplo de la información que se muestra como resultado de la ejecución de este comando:
Max storage for lock list (4KB) (LOCKLIST) = 50 Interval for checking deadlock (ms) (DLCHKTIME) = 10000 Percent. of lock lists per application (MAXLOCKS) = 22 Lock time out (sec) (LOCKTIMEOUT) = -1 Max number of active applications (MAXAPPLS) = AUTOMATIC
Para obtener detalles sobre la configuración de estos parámetros, consulte el centro de información de IBM DB2.