2012-03-23 7 views
6

Próbuję zademonstrować odczyty fantomowe w MySQL za pomocą JDBC. Rozumiem, że na poziomie izolacji REPEATABLE-READ fantomy powinny być możliwe. Ale nie mogę tego zmusić. Moje transakcje są skonfigurowane następująco:próbuje utworzyć fantom w MySQL pod poziomem izolacji REPEATABLE-READ

Transakcji 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"; 

transakcja 2:

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

mam je w macierzach b/c Używam Statement.execute() metoda wykonania każdej linii i mam autocommit ustawiony na false.

Dlaczego zapytanie z querySetOne [1] i querySetOne [3] zwraca te same wyniki pod powtarzalnym poziomem izolacji odczytu?

+0

Przeczytaj to pytanie [? Jak produkować fantom czyta] (http://stackoverflow.com/questions/5444915/how-to-produce-phantom-reads) –

Odpowiedz

0

Phantomy nie są możliwe z REPEATABLE READ. Phantomy są konsekwencją READ COMMITTED. To jest główna różnica między RR i RC. Niedawno napisałem post na blogu wyjaśniający dwa poziomy izolacji, ponieważ często są mylone: ​​http://blog.9minutesnooze.com/repeatable-read-read-committed/

+0

Ok, mam włączony silnik bazy danych do MyISAM. Teraz wszystkie poziomy izolacji mogą (i robią) produkować fantomy ... Dlaczego SERIALIZOWALNY poziom izolacji produkuje fantomy w MyISAM, czy nie powinien blokować drugiej transakcji, aż do pierwszego zakończenia? – user1251858

+0

MyISAM nie jest mechanizmem magazynowania transakcji, więc REPEATABLE READ/READ COMMITTED/etc nie ma żadnego efektu. Z silników domyślnie dostarczanych z MySQL należy korzystać z InnoDB. –

3

Standard SQL wydaje się wskazywać, że odczyty fantomowe są możliwe w powtarzalnej izolacji odczytu, ale nie mówią, że są wymagane.

W szczególności silnik InnoDB MySQL obsługuje consistent reads w ramach powtarzalnej izolacji odczytu, co oznacza, że ​​pierwszy odczyt w transakcji tworzy migawkę i ponowne jej odczytanie później w transakcji używa tej samej migawki.

MySQL documentation mówi to o powtarzalne izolacja odczytu:

Wszystko zgodne czyta w tej samej transakcji odczytać migawkę ustanowiony przez pierwszy przeczytałem. Ta konwencja oznacza, że ​​jeśli wydasz kilka prostych (niezablokowanych) instrukcji SELECT w ramach tej samej transakcji, te instrukcje SELECT będą spójne także względem siebie.

Powiązane problemy