Bloqueos en el SGBD
Los sistemas de gestión de bases de datos permiten a un usuario obtener y modificar datos. Sin embargo, hoy en día miles de personas pueden hacer cambios en una base de datos al mismo tiempo. Si los usuarios se dedican sobre todo a leer datos, esa carga no supone un gran problema para el servidor de base de datos. Pero si algunos usuarios añaden o modifican datos a la vez, el servidor tiene que resolver tareas mucho más complejas.
Imagina que estás preparando un informe financiero que resume las ventas diarias de una tienda durante una semana. Mientras trabajas en el informe, ocurren a la vez estas operaciones:
- Un cliente compra un artículo.
- Otro cliente devuelve un artículo defectuoso y recibe el reembolso.
- La tienda recibe un nuevo lote de mercancía.
Es decir, mientras elaboras tu informe, varios usuarios están modificando la información de la base de datos. Entonces, ¿qué cifras deberían aparecer en el informe?
La respuesta depende de cómo gestione los bloqueos tu servidor.
Bloqueo
Un bloqueo es un mecanismo que restringe el acceso a los datos para garantizar que las transacciones se procesen correctamente.
Los servidores de bases de datos usan bloqueos para controlar el acceso simultáneo a los datos: mientras una transacción trabaja con unos datos, las demás transacciones no pueden modificarlos.
Cuando unos datos de la base están bloqueados, los demás usuarios que quieran leerlos o modificarlos tienen que esperar a que se libere el bloqueo.
Granularidad de los bloqueos
Hay varias estrategias sobre cómo bloquear exactamente un recurso. El servidor puede aplicar el bloqueo en uno de tres niveles distintos, o granularidades.
Cada uno de estos enfoques tiene sus ventajas e inconvenientes. Bloquear una tabla entera lleva poco tiempo, pero cuando hay muchos usuarios puede provocar esperas largas. Bloquear filas exige más trabajo adicional, pero a cambio permite que varios usuarios modifiquen la misma tabla a la vez, siempre que trabajen con filas distintas.
MySQL puede usar bloqueos de tabla, de página o de fila según el motor de almacenamiento que elijas. Por defecto, MySQL usa el motor de almacenamiento InnoDB, que admite bloqueos de fila.
PostgreSQL usa el control de concurrencia multiversión (MVCC) y trabaja por defecto con bloqueos de fila.
Antes de pasar al siguiente artículo, sobre las transacciones, comprobemos qué tal has entendido esta lección.
¿Para qué sirven los bloqueos en un SGBD?