He leído sobre 4 niveles de aislamiento:
Isolation Level Dirty Read Nonrepeatable Read Phantom Read
READ UNCOMMITTED Permitted Permitted Permitted
READ COMMITTED -- Permitted Permitted
REPEATABLE READ -- -- Permitted
SERIALIZABLE -- -- --
Quiero entender el bloqueo que toma el aislamiento de cada transacción sobre la mesa.
READ UNCOMMITTED - no lock on table
READ COMMITTED - lock on committed data
REPEATABLE READ - lock on block of sql(which is selected by using select query)
SERIALIZABLE - lock on full table(on which Select query is fired)
A continuación se muestran los tres fenómenos que pueden ocurrir en el aislamiento de transacciones
Lectura sucia - sin bloqueo
Lectura no
repetible - sin lectura sucia como bloqueo en datos comprometidos
Lectura fantasma - bloqueo en bloque de sql (que se selecciona mediante la consulta de selección)
Quiero entender dónde definimos estos niveles de aislamiento: solo en el nivel jdbc / hibernate o en DB también
PD: he revisado los enlaces en los niveles de aislamiento en Oracle , pero se ven torpes y hablan sobre bases de datos específicas
java
transactions
isolation-level
Aprendiz
fuente
fuente
Respuestas:
Por ejemplo, tiene 3 procesos simultáneos A, B y C. A inicia una transacción, escribe datos y confirma / deshace (según los resultados). B simplemente ejecuta una
SELECT
declaración para leer datos. C lee y actualiza datos. Todos estos procesos funcionan en la misma mesa T.WHERE aField > 10 AND aField < 20
, es decir , A inserta datos donde elaField
valor está entre 10 y 20, luego B lee los datos nuevamente y obtiene un resultado diferente.Usando JDBC, lo define usando
Connection#setTransactionIsolation
.Usando Hibernate:
Dónde
La configuración de Hibernate se toma de aquí (lo siento, está en español).
Por cierto, también puede establecer el nivel de aislamiento en RDBMS:
SET ISOLATION TO DIRTY READ
oración).y así sucesivamente...
fuente
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:
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 :
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:
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.
fuente
Los bloqueos siempre se toman a nivel DB: -
Documento oficial de Oracle: - Para evitar conflictos durante una transacción, un DBMS utiliza bloqueos, mecanismos para bloquear el acceso de otros a los datos a los que accede la transacción. (Tenga en cuenta que en el modo de confirmación automática, donde cada instrucción es una transacción, los bloqueos se mantienen solo para una instrucción). Después de establecer un bloqueo, permanece vigente hasta que la transacción se confirma o se deshace. Por ejemplo, un DBMS podría bloquear una fila de una tabla hasta que se hayan confirmado las actualizaciones. El efecto de este bloqueo sería evitar que un usuario obtenga una lectura sucia, es decir, leer un valor antes de que se convierta en permanente. (Acceder a un valor actualizado que no se ha confirmado se considera una lectura sucia porque es posible que ese valor se revierta a su valor anterior. Si lee un valor que luego se revirtió, habrá leído un valor no válido. )
La forma en que se establecen los bloqueos está determinada por lo que se denomina nivel de aislamiento de transacciones, que puede variar desde no admitir transacciones en absoluto hasta admitir transacciones que imponen reglas de acceso muy estrictas.
Un ejemplo de un nivel de aislamiento de transacciones es TRANSACTION_READ_COMMITTED, que no permitirá acceder a un valor hasta después de que se haya confirmado. En otras palabras, si el nivel de aislamiento de la transacción se establece en TRANSACTION_READ_COMMITTED, el DBMS no permite que se produzcan lecturas sucias. La interfaz Connection incluye cinco valores que representan los niveles de aislamiento de transacciones que puede utilizar en JDBC.
fuente