2012-04-06 31 views
8

yo probamos este con MySQL Server 5.5:MySQL lectura repetible y perdió actualización/fantasma lee

1) aseguró que el nivel de aislamiento de transacción es REPEATABLE_READ

2) comenzó shell-1, comenzó una transacción en el mismo, entonces leer un valor a través seleccione

3) comenzó shell-2, comenzó una transacción en él, entonces leer el mismo valor a través de selección

4) en shell-1, actualizado el valor de valorar + 1 y comprometido

5) en shell-2, actualizado el valor de valorar + 1 y comprometido

El valor perdió una de sus actualizaciones y se incrementó solamente por 1.

Ahora, como lo entiendo, usos RR bloqueos de lectura compartidos y bloqueos de escritura exclusivos, lo que significa que en los números 4 y 5 anteriores, las transacciones deberían haberse bloqueado, pero eso no sucedió.

Entonces mi comprensión de RR es incorrecta o MySQL implementa RR de una manera diferente. ¿Así que qué es lo?

EDITAR: a través de un experimento similar, también confirma que una transacción RR (t1) no ve filas insertadas en la misma tabla por otra transacción RR (t2), si hace otra selección en esa tabla incluso después de que t2 y antes de cometer t1. (Aquí está el enlace a este experimento: http://www.databasejournal.com/features/mysql/article.php/3393161/MySQL-Transactions-Part-II---Transaction-Isolation-Levels.htm)

¿Significa que el RR de MySQL también se ocupa de las lecturas fantasmas?

+0

¿Ha intentado transacciones serializables? http://dev.mysql.com/doc/refman/5.1/en/set-transaction.html#isolevel_serializable – biziclop

+0

Sí, y parece que MySQL serializable usa bloqueos de lectura compartidos y bloqueos de escritura exclusivos, y por lo tanto da un punto muerto en el arriba caso. Así que estoy realmente confundido, porque esto es lo que dice el libro 'JP with Hibernate': "Un sistema que funciona en modo de aislamiento de lectura repetible no permite lecturas irrepetibles ni lecturas sucias. Lecturas fantasmas pueden ocurrir. Leer transacciones transacciones de escritura en bloque (pero no otras transacciones de lectura) y las transacciones de escritura bloquean todas las demás transacciones ". (página 456) – shrini1000

Respuesta

6

MySQL no se ajusta realmente a Lectura repetible. Puede obligarlo a hacerlo utilizando el nivel de aislamiento serializable o poniendo un FOR UPDATE después de sus selecciones (mire el ejemplo a continuación). Entonces se logrará el comportamiento deseado. En cuanto a las lecturas fantasma, MySQL es en realidad más estricta de lo necesario ...

SELECT value FROM table WHERE id = 7 FOR UPDATE; 
+0

¡gracias! Podrías pl citar una referencia para esto, así que puedo aceptarlo como una respuesta? – shrini1000

+4

http://www.cs.umb.edu/~poneil/iso.pdf indica que las actualizaciones perdidas no son posibles en Lectura repetible. Puede encontrar el resumen en la última página y la discusión sobre esa anomalía específica en algún lugar en el medio (solo busque "actualización perdida"). No puedo darle más referencias, espero que sea suficiente por ahora. – Argeman

+0

Solo para estar seguro: las actualizaciones perdidas son de hecho posibles cuando se usa InnoDB con lectura repetible debido a su implementación no conforme. ¿Está bien? – Basti

Cuestiones relacionadas