2012-03-23 14 views
6

Estoy intentando demostrar una lectura fantasma en MySQL mediante el uso de JDBC. Entiendo que bajo el nivel de aislamiento REPEATABLE-READ, los fantasmas deberían ser posibles. Pero no puedo hacer que suceda. Mis transacciones están configurados de la siguiente manera:tratando de crear un fantasma en MySQL bajo el nivel de aislamiento REPEATABLE-READ

Transacción 1:

querySetOne[0] = "use adventureworks"; 
querySetOne[1] = "select * from vendorcontact where ContactTypeID between 10 and 30"; 
querySetOne[2] = "select sleep(20)"; 
querySetOne[3] = "select * from vendorcontact where ContactTypeID between 10 and 30"; 
querySetOne[4] = "COMMIT"; 

Transacción 2:

querySetTwo[0] = "use adventureworks"; 
querySetTwo[1] = "select sleep(2)"; 
querySetTwo[2] = "insert into vendorcontact values (105, 700, 20, NULL)"; 
querySetTwo[3] = "COMMIT"; 

los tengo en matrices b/c que estoy usando el Statement.execute() método para ejecutar cada línea y he establecido el autocommit como falso.

¿Por qué la consulta de querySetOne [1] y querySetOne [3] devuelve los mismos resultados bajo el nivel de aislamiento de lectura repetible?

+0

Leer esta pregunta: [? Cómo producir fantasma lee] (http://stackoverflow.com/questions/5444915/how-to-produce-phantom-reads) –

Respuesta

0

Los fantasmas no son posibles con REPEATABLE READ. Los fantasmas son una consecuencia de READ COMPROMETIDO. Esa es la principal distinción entre RR y RC. Recientemente escribí una publicación en el blog explicando los dos niveles de aislamiento, ya que a menudo se confunden: http://blog.9minutesnooze.com/repeatable-read-read-committed/

+0

bien, he cambiado el motor de base de datos a MyISAM. Ahora todos los niveles de aislamiento pueden (y lo hacen) producir un fantasma ... ¿Por qué el nivel de aislamiento SERIALIZABLE produce fantasmas en MyISAM? ¿No debería bloquear aún la segunda transacción hasta que termine el 1er? – user1251858

+0

MyISAM no es un motor de almacenamiento transaccional, por lo que READATABLE READ/READ COMMITTED/etc no tiene ningún efecto. Desde los motores que se envían con MySQL de forma predeterminada, debe usar InnoDB. –

3

El estándar SQL parece indicar que las lecturas fantasmas son posibles en el aislamiento de lectura repetible, pero no dice que sean necesarias.

En particular, el motor InnoDB de MySQL admite consistent reads bajo aislamiento de lectura repetible, lo que significa que la primera lectura en una transacción crea una instantánea y la lectura de nuevo más adelante en la transacción utiliza la misma instantánea.

El MySQL documentation dice lo siguiente acerca de aislamiento de lectura repetible:

Todas las lecturas consistentes dentro de la misma transacción leer la instantánea establecida por la primera lectura. Esta convención significa que si emite varias instrucciones SELECT simples (sin bloqueo) dentro de la misma transacción, estas declaraciones SELECT son consistentes también entre sí.

Cuestiones relacionadas