A continuación se reproduce la declaración escrita de Wikipedia's Isolation article sobre REPEATABLE READS
Algunas aclaraciones sobre diferentes niveles de aislamiento en la transacción de la base de datos?
En este nivel de aislamiento, una concurrencia aplicación DBMS de control basados en la cerradura sigue leer y escribir cerraduras (adquirida en los datos seleccionados) hasta el final de la transacción. Sin embargo, los bloqueos de rango no se gestionan, por lo que puede ocurrir el fenómeno de lecturas fantasmas (ver a continuación).
Mi pregunta aquí es cuándo comienza y finaliza la transacción, respectivamente.
Si tomamos el ejemplo de lecturas no repetibles con las lecturas repetibles Nivel de aislamiento en el mismo enlace, según mi entendimiento trnsaction 1 comienzan cuando la primera consulta se dispara es decir SELECT * FROM users WHERE id = 1.
DBMS mantendrá el bloqueo en la tabla usuarios hasta y a menos que la transacción llegue a su fin. aquí Al final es decir cuando la conexión se retrotrae o se compromete no en la finalización de SELECT * FROM users WHERE id = 1
. Hasta ese momento La transacción 2 esperará ¿Correcto?
Pregunta 2: - Ahora bien, si tenemos en cuenta el nivel de aislamiento competentes y comportamiento como se indica a continuación (en el mismo enlace)
Isolation level Dirty reads Non-repeatable Phantoms
Read Uncommitted may occur may occur may occur
Read Committed - may occur may occur
Repeatable Read - may occur -
Serializable - - -
Según mi entendimiento más fiable es Serializable entonces Lectura repetible y luego Leído Comprometido pero aún he visto aplicaciones usando Read Committed. Es porque de rendimiento de lectura serializable y repetible es malo en comparación con Read Committed porque en serializable será secuencial y en caso de que de transacción tenga que esperar la liberación del bloqueo por otra transacción. ¿Correcto? Para obtener el mejor de los tres podemos usar el nivel de aislamiento como leído confirmado con SELECT FOR UPDATE
(para lograr una lectura repetible). No estoy seguro de cómo podemos lograr la lectura fantasma si así lo deseamos, en caso de lectura comprometida nivel de aislamiento?
Ver http://stackoverflow.com/questions/10935850/when -to-use-select-for-update para una discusión de 'SELECT ... FOR UPDATE' – Gili
Para obtener lo mejor de los tres podemos usar el nivel de aislamiento como Leído Comprometido con SELECCIONAR PARA ACTUALIZAR: este es el enfoque de las capas de persistencia de JDO como Datanucleus. Proporcionan un mecanismo para controlar "SELECCIONAR PARA ACTUALIZAR" por transacción. Creo que este enfoque dará los beneficios del mecanismo de bloqueo de transacciones serializable cuando se usan tipos de transacciones "inferiores". – marcolopes
¿Está seguro de que se puede producir "lectura repetible" en una transacción con nivel de aislamiento "No repetible"? En este artículo, la tabla es diferente: http://www.oracle.com/technetwork/issue-archive/2010/10-jan/o65asktom-082389.html – naXa