Lo primero para empezar el trabajo con SQL Server es preparar el ambiente. La instalación…
Tipos de Bloqueos en SQL Server
El término «Locking» en inglés que muchas veces traducimos como «Bloqueo» al español (que personalmente creo que nos lleva a un malentendido de conceptos), en realidad nos referencia a la protección de información sobre objetos, en los que consideramos diferentes transacciones u operaciones en una Base de Datos.
Estos términos inmediatamente nos llevan a recordar sobre las propiedades de una unidad de trabajo: Atomicidad, Consistencia, Aislamiento y Durabilidad (ACID). Esto lo dejaremos para otra oportunidad, ahora a lo que vinimos. Los Tipos de Bloqueos.
PARA ENTENDER MEJOR UN LOCK
Un Lock se presenta como un mecanismo de protección para sincronizar el acceso de múltiples usuarios a la misma porción de datos. El modo (o tipo) de Lock, define el nivel de dependencia que la transacción tiene sobre el dato.
Debemos considerar dos aspectos principales cuando hablamos de Locks: Modos y Granularidad
MODOS DE LOCKS – un poco de teoría
LOCK MODE | GENERADO EN... |
---|---|
Shared (S) | Operaciones de lectura que no cambian ni actualizan datos |
Update (U) | Recursos que pueden ser actualizados. Previene deadlocks en concurrencia que lee datos, genera Locks y actualiza posteriormente |
Exclusive (X) | Operaciones de modificación de datos como UPDATE, DELETE o INSERT. Previene actualizaciones simulátaneas en el mismo recurso al mismo tiempo |
Intent | Establece una jerarquía de Lock |
Schema | Una operación dependiente de un Schema de una tabla donde se está generando una ejecución |
Bulk Update (BU) | Operación de Bulk para población de datos en una tabla y el "HINT" TABLOCK es especificado |
GRANULARIDAD DEL LOCK – lo más importante a analizar
Una transacción puede generar un Lock de diferente tipo para minimizar el costo que representa sobre el recurso.
Generar el Locking a una granularidad menor incrementa la concurrencia, sin embargo como es de esperarse, hacerlo significa una mayor carga por la cantidad de Locks necesarios.
Al contrario es similar, un Lock más grande tiene menor carga operativa pero disminuye la concurrencia.
Este el trabajo que realiza SQL Server en función a las operaciones que va atendiendo. Los niveles de granularidad son varios, sin embargo a continuación detallaré algunos de ellos.
RECURSO | DESCRIPCIÓN |
---|---|
RID | Lock a una fila de una tabla heap |
KEY | Lock a un índice para proteger la llave en tranasacciones |
PAGE | Lock a una página de 8KB de datos o de índice |
TABLE | Lock a una tabla entera con datos e índices |
DATABASE | Lock a la base de datos completa |
El detalle es mucho más extenso en la documentación oficial.
Lo que es importante tener en mente es que la protección que nos dan los Locks respecto a la integridad de nuestra información pueden tener un costo asociado y nuestro trabajo es darle la velocidad necesaria a nuestros programas para mantener su eficiencia.
CONSIDERACIONES IMPORTANTES
- Decir «Bloqueo» va más allá de pensar en algo malo dentro de las Bases de Datos. Este es un concepto errado
- Los Locks nos garantizan la integridad de nuestros Datos
- El Testing de nuestros desarrollos es vital, simulando concurrencia. Si no lo hacemos simulando un escenario real, difícilmente se evidencian factores como estos y siempre escucharemos la frase «…pero funcionaba en Desarrollo».
- El monitoreo de nuestros servidores nos ayudará a comprender qué tipos de Locks se están generando y si ello está dentro de una actividad normal o si nos está causando algún cuello de botella.
- Entender los tipos de bloqueos es aquello que nos llevará a saber cómo reaccionar ante cualquier escenario que involucre locks.
Finalmente no te olvides entender Qué significa NOLOCK en SQL Server.