2011-09-14 16 views
5

A continuación se reproduce la declaración escrita de Wikipedia's Isolation article sobre REPEATABLE READSAlgunas 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?

+0

Ver http://stackoverflow.com/questions/10935850/when -to-use-select-for-update para una discusión de 'SELECT ... FOR UPDATE' – Gili

+0

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

+0

¿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

Respuesta

6

Oracle no admite el nivel de aislamiento REPEATABLE READ. Sin embargo, SQL Server sí lo hace, y coloca bloqueos en todas las filas seleccionadas por la transacción hasta que finaliza (es decir: se confirma o revierte). De modo que está en lo cierto, esto hará que otras transacciones esperen (si están actualizando los datos bloqueados) y puede ser perjudicial para la concurrencia.

En cuanto a la pregunta 2: Sí, cuanto más alto sea el nivel de aislamiento, peor serán sus transacciones simultáneas porque tendrán que esperar a que se liberen más bloqueos. No estoy seguro de lo que quiere decir con "obtener el mejor de los tres" usando SELECT FOR UPDATE porque SELECT FOR UPDATE colocará bloqueos de fila en todas las filas seleccionadas.

Y, por último, he aquí un fragmento del manual del Oracle en fantasma lee:

[lecturas fantasma se producen cuando] una transacción vuelve a ejecutar una consulta que devuelve un conjunto de filas que satisface una condición de búsqueda y encuentra que otra transacción confirmada ha insertado filas adicionales que satisfacen la condición.

Por ejemplo, una transacción consulta el número de empleados.Cinco minutos más tarde realiza la misma consulta, pero ahora el número ha aumentado en uno porque otro usuario insertó un registro para un nuevo empleado. Más datos satisfacen los criterios de consulta que antes, pero a diferencia de una lectura difusa, los datos leídos previamente no se modifican.


Referencia:

+0

"No estoy seguro de lo que quiere decir con" obtener lo mejor de los tres "Básicamente, lo que estoy tratando de preguntar aquí es que si usamos el nivel de aislamiento de lectura confirmada en el oráculo, seguiremos teniendo problemas de lectura fantasma y no repetibles. ¿De acuerdo? Según mi comprensión, antes que nada no deberíamos llamarlos problemas pero estos deben considerarse como un comportamiento correcto porque entre la primera transacción si la segunda transacción se confirma, entonces deberíamos obtener datos actualizados. ¿Correcto? Continúa ... –

+1

continuación ... La segunda pregunta es que si queremos evitar problemas de lecturas fantasma no repetibles con read commited en Oracle, ¿hay alguna manera? Por mi parte, si utilizamos Select para la consulta de actualización, podemos guardarlo de lecturas no repetibles. ¿Correcto? ¿Pero no estamos seguros de cómo podemos evitar la lectura fantasma? –

Cuestiones relacionadas