Mecanismos de sincronización
Cuando dos transacciones necesitan acceder al mismo recurso, el sistema debe decidir quién puede leer y quién puede escribir. Si no hay control, las escrituras simultáneas corrompen datos y las lecturas durante una escritura producen información inconsistente.
Cómo los tipos de lock controlan el acceso concurrente
La base de datos utiliza locks para decidir quién accede a un recurso y cómo. Cada uno existe para una necesidad distinta.
Los siguientes son mecanismos utilizados por la estrategia de control de concurrencia pesimista.
Shared Lock (S) — para lecturas concurrentes
Un shared lock permite que varias transacciones lean el mismo recurso al mismo tiempo, siempre y cuando no se intente modificar.
El S lock protege el recurso contra escrituras, garantizando que el dato no cambie durante la lectura.

Exclusive Lock (X) — para escrituras exclusivas
Un exclusive lock otorga a una transacción el acceso exclusivo a un recurso para modificarlo.
Mientras el X lock está activo, ninguna otra transacción puede leer ni escribir sobre ese recurso.

Matriz de compatibilidad
La compatibilidad determina si una transacción puede adquirir un lock cuando otro ya está presente sobre el mismo recurso:
| Lock solicitado \ Lock actual | S (shared) | X (exclusive) |
|---|---|---|
| S (shared) | ✅ | ❌ |
| X (exclusive) | ❌ | ❌ |
Shared y Exclusive locks en acción con SQL
Las siguientes simulaciones muestran el comportamiento de los locks con dos sesiones concurrentes.
Shared lock permite lecturas simultáneas
-- Sesión 1 | -- Sesión 2
BEGIN; |
SELECT * FROM cuentas |
WHERE id = 'A' FOR SHARE; |
-- T1 adquiere S lock sobre A |
| BEGIN;
| SELECT * FROM cuentas
| WHERE id = 'A' FOR SHARE;
| -- T2 adquiere otro S lock ✅
| -- ambas leen simultáneamente
COMMIT; |
| COMMIT;
Shared lock bloquea escritura
-- Sesión 1 | -- Sesión 2
BEGIN; |
SELECT * FROM cuentas |
WHERE id = 'A' FOR SHARE; |
-- T1 tiene S lock sobre A |
| BEGIN;
| UPDATE cuentas SET saldo=200
| WHERE id = 'A';
| -- T2 ESPERA X lock sobre A ❌
COMMIT; |
-- T1 libera el S lock |
| -- T2 adquiere X lock y modifica
| COMMIT;
Exclusive lock bloquea todo acceso
-- Sesión 1 | -- Sesión 2
BEGIN; |
SELECT * FROM cuentas |
WHERE id = 'A' FOR UPDATE; |
-- T1 adquiere X lock sobre A |
| BEGIN;
| SELECT * FROM cuentas
| WHERE id = 'A' FOR SHARE;
| -- T2 espera S lock sobre A ❌
| -- ni siquiera puede leer
COMMIT; |
-- T1 libera el X lock |
| -- T2 adquiere S lock y lee
| COMMIT;
Trade-offs entre concurrencia y protección
| Enfoque | Ventaja | Desventaja |
|---|---|---|
| Shared Lock (S) | Concurrente Permite alta concurrencia en lecturas | Permisivo No protege contra escrituras concurrentes |
| Exclusive Lock (X) | Aislado Garantiza aislamiento total sobre el recurso | Bloqueante Bloquea todo acceso, reduce concurrencia |
Errores frecuentes
Error: Un shared lock impide que otras transacciones lean el mismo dato.
Falso. El shared lock está diseñado precisamente para lo contrario: permite que múltiples transacciones lean simultáneamente. Lo que impide es que alguien modifique el dato mientras está siendo leído.
Error: Un exclusive lock permite que otros lean el dato, solo bloquea escrituras.
No. El exclusive lock bloquea tanto lecturas como escrituras. El nombre "exclusivo" significa que la transacción tiene acceso exclusivo total: nadie más puede tocar el recurso hasta que termine.