Ejemplos de escritura simultánea
En los siguientes ejemplos de pseudocódigo, se demuestra cómo, cuando se ejecutan de manera simultánea, las transacciones avanzan o esperan.
Operaciones COPY simultáneas en la misma tabla
La transacción 1 copia filas en la tabla LISTING:
begin; copy listing from ...; end;
La transacción 2 comienza de manera simultánea en una sesión por separado y copia más filas en la tabla LISTING. La transacción 2 debe esperar hasta que la transacción 1 levante el bloqueo de escritura de la tabla LISTING; luego, podrá avanzar.
begin; [waits] copy listing from ; end;
El mismo comportamiento se observaría si una o ambas transacciones tuvieran un comando INSERT, en lugar de COPY.
Operaciones DELETE simultáneas en la misma tabla
La transacción 1 elimina filas de una tabla:
begin; delete from listing where ...; end;
La transacción 2 comienza de manera simultánea y elimina filas de la misma tabla. Tendrá éxito porque espera a que la transacción 1 termine antes de probar eliminar filas.
begin [waits] delete from listing where ; end;
El mismo comportamiento se observaría si una o ambas transacciones tuvieran un comando UPDATE para la misma tabla, en lugar de DELETE.
Transacciones simultáneas con una mezcla de operaciones de lectura y escritura
En este ejemplo, la transacción 1 elimina filas de la tabla USERS, vuelve a cargar la tabla, ejecuta una consulta COUNT(*) y, luego, ANALYZE, antes de confirmar:
begin; delete one row from USERS table; copy ; select count(*) from users; analyze ; end;
Mientras tanto, comienza la transacción 2. Esta transacción prueba copiar filas adicionales en la tabla USERS, analizarla y, luego, ejecutar la misma consulta COUNT(*) que la primera transacción:
begin; [waits] copy users from ...; select count(*) from users; analyze; end;
La segunda transacción tendrá éxito porque debe esperar a que la primera termine. Su consulta COUNT devolverá el recuento en función de la carga que ha completado.