Operaciones de lectura y escritura y de escritura
Puede administrar el comportamiento específico de las operaciones simultáneas de escritura al decidir cuándo y cómo ejecutar diferentes tipos de comandos. Los siguientes comandos son relevantes en este análisis:
-
Comandos COPY, que realizan cargas (iniciales o incrementales).
-
Comandos INSERT, que agregan una o más filas por vez.
-
Comandos UPDATE, que modifican filas existentes.
-
Comandos DELETE, que eliminan filas.
Las operaciones COPY e INSERT son operaciones solo de escritura, pero DELETE y UPDATE son operaciones de lectura y escritura. (Para actualizar o eliminar las filas, primero es necesario leerlas). Los resultados de las operaciones simultáneas de escritura dependen de los comandos específicos que se están ejecutando simultáneamente. Las operaciones COPY e INSERT en una misma tabla se mantienen en un estado de espera hasta que se levanta el bloqueo; luego, avanzan con normalidad.
Las operaciones UPDATE y DELETE se comportan de manera diferente porque dependen de una lectura inicial de la tabla antes de cualquier escritura. Dado que las transacciones simultáneas son invisibles entre sí, tanto UPDATE como DELETE deben leer una snapshot de los datos de la última confirmación. Cuando la primera operación UPDATE o DELETE levanta el bloqueo, la segunda debe determinar si los datos con los que trabajará son potencialmente obsoletos. No lo serán, porque la segunda transacción no obtiene su snapshot de los datos sino hasta después de que la primera transacción haya levantado su bloqueo.
Situación potencial de bloqueo para transacciones de escritura simultáneas
Siempre que las transacciones involucren actualizaciones de más de una tabla, existe la posibilidad de que transacciones que se ejecutan de manera simultánea se bloqueen al querer escribir en el mismo conjunto de tablas. Una transacción levanta todos sus bloqueos de tabla a la vez, ya sea cuando confirma o cuando se revierte; no los libera de a uno.
Por ejemplo, supongamos que las transacciones T1 y T2 comienzan, aproximadamente, al mismo tiempo. Si T1 comienza a escribir en la tabla A y T2 comienza a escribir en la tabla B, ambas transacciones pueden avanzar sin conflicto alguno; no obstante, si T1 finaliza su escritura de la tabla A y necesita comenzar a escribir en la tabla B, no podrá hacerlo porque T2 aún la bloquea. De manera inversa, si T2 termina de escribir en la tabla B y necesita comenzar a escribir en la tabla A tampoco podrá hacerlo porque T1 aún la bloquea. Como ninguna de las transacciones puede levantar sus bloqueos sino hasta que todas las operaciones de escritura se hayan confirmado, ninguna transacción puede avanzar.
Para evitar este tipo de bloqueo, debe programar las operaciones de escritura simultáneas con sumo cuidado. Por ejemplo, siempre debe actualizar las tablas en el mismo orden en las transacciones y, si especifica bloqueos, bloquee las tablas en el mismo orden antes de realizar cualquier operación DML.