Como dice brb tea, depende de la implementación de la base de datos y del algoritmo que utilicen: MVCC o Two Phase Locking.
CUBRID (RDBMS de código abierto) explica la idea de estos dos algoritmos:
- Bloqueo de dos fases (2PL)
La primera es cuando la transacción T2 intenta cambiar el registro A, sabe que la transacción T1 ya ha cambiado el registro A y espera hasta que se complete la transacción T1 porque la transacción T2 no puede saber si la transacción T1 se confirmará o transferirá. espalda. Este método se llama bloqueo de dos fases (2PL).
- Control de concurrencia de múltiples versiones (MVCC)
El otro es permitir que cada una de ellas, las transacciones T1 y T2, tengan sus propias versiones modificadas. Incluso cuando la transacción T1 ha cambiado el registro A de 1 a 2, la transacción T1 deja el valor original 1 como está y escribe que la versión de la transacción T1 del registro A es 2. Luego, la siguiente transacción T2 cambia el registro A de 1 a 3, no de 2 a 4, y escribe que la versión de transacción T2 del registro A es 3.
Cuando se revierte la transacción T1, no importa si el 2, la versión de la transacción T1, no se aplica al registro A. Después de eso, si se confirma la transacción T2, la 3, la versión de transacción T2, se aplicará al registro A. Si la transacción T1 se confirma antes de la transacción T2, el registro A se cambia a 2 y luego a 3 en el momento de confirmar la transacción T2. El estado final de la base de datos es idéntico al estado de ejecución de cada transacción de forma independiente, sin ningún impacto en otras transacciones. Por tanto, satisface la propiedad ACID. Este método se denomina control de simultaneidad de múltiples versiones (MVCC).
El MVCC permite modificaciones concurrentes a costa de una mayor sobrecarga en la memoria (porque tiene que mantener diferentes versiones de los mismos datos) y cálculo (en el nivel REPETEABLE_READ no puede perder actualizaciones, por lo que debe verificar las versiones de los datos, como Hiberate hace con Optimistick Locking ).
En 2PL, los niveles de aislamiento de transacciones controlan lo siguiente :
Si se toman bloqueos cuando se leen datos y qué tipo de bloqueos se solicitan.
Cuánto tiempo se mantienen los bloqueos de lectura.
Si una operación de lectura que hace referencia a filas modificadas por otra transacción:
Bloquear hasta que se libere el bloqueo exclusivo de la fila.
Recupere la versión confirmada de la fila que existía en el momento en que comenzó la declaración o transacción.
Lea la modificación de datos no confirmada.
La elección de un nivel de aislamiento de transacciones no afecta los bloqueos que se adquieren para proteger las modificaciones de datos. Una transacción siempre obtiene un bloqueo exclusivo en cualquier dato que modifica y mantiene ese bloqueo hasta que se completa la transacción, independientemente del nivel de aislamiento establecido para esa transacción. Para operaciones de lectura, los niveles de aislamiento de transacciones definen principalmente el nivel de protección contra los efectos de las modificaciones realizadas por otras transacciones.
Un nivel de aislamiento más bajo aumenta la capacidad de muchos usuarios para acceder a los datos al mismo tiempo, pero aumenta la cantidad de efectos de simultaneidad , como lecturas sucias o actualizaciones perdidas, que los usuarios pueden encontrar.
Ejemplos concretos de la relación entre bloqueos y niveles de aislamiento en SQL Server (use 2PL excepto en READ_COMMITED con READ_COMMITTED_SNAPSHOT = ON)
READ_UNCOMMITED: no emita bloqueos compartidos para evitar que otras transacciones modifiquen los datos leídos por la transacción actual. Las transacciones READ UNCOMMITTED tampoco están bloqueadas por bloqueos exclusivos que evitarían que la transacción actual lea filas que han sido modificadas pero no confirmadas por otras transacciones. [...]
READ_COMMITED:
- Si READ_COMMITTED_SNAPSHOT está configurado en OFF (el valor predeterminado): usa bloqueos compartidos para evitar que otras transacciones modifiquen filas mientras la transacción actual está ejecutando una operación de lectura. Los bloqueos compartidos también impiden que la declaración lea filas modificadas por otras transacciones hasta que se complete la otra transacción. [...] Los bloqueos de filas se liberan antes de que se procese la siguiente fila. [...]
- Si READ_COMMITTED_SNAPSHOT se establece en ON, el motor de base de datos usa el control de versiones de fila para presentar cada declaración con una instantánea transaccionalmente coherente de los datos tal como existían al comienzo de la declaración. Los bloqueos no se utilizan para proteger los datos de las actualizaciones de otras transacciones.
REPETEABLE_READ: Los bloqueos compartidos se colocan en todos los datos leídos por cada declaración en la transacción y se mantienen hasta que se completa la transacción.
SERIALIZABLE: Los bloqueos de rango se colocan en el rango de valores clave que coinciden con las condiciones de búsqueda de cada declaración ejecutada en una transacción. [...] Los bloqueos de rango se mantienen hasta que se completa la transacción.