2012-04-06 9 views
8

Próbowałem to z MySQL Server 5.5:MySQL powtarzalne odczytu i stracił aktualizacja/phantom czyta

1) zapewnił, że poziom izolacji transakcji jest repeatable_read

2) rozpoczął shell-1, rozpoczął transakcję w nim, następnie odczytać wartość poprzez wybierz

3) rozpoczął shell-2, rozpoczął transakcję w nim, a następnie odczytać tę samą wartość przez wybierają

4), w powłoce-1, zaktualizowane wartości do wartości + 1 oraz popełnione

5) w skorupkach-2, zaktualizowane wartości do wartości + 1 i zaangażowana

Wartość stracił jednego z jego aktualizacji i została zwiększona tylko o 1.

Teraz, jak rozumiem, wykorzystuje RR udostępnione blokady odczytu i wyłączne blokady zapisu, co oznacza, że ​​w punktach # 4 i 5 transakcje powinny być zablokowane, ale tak się nie stało.

Więc albo moje rozumienie RR jest wadliwe, albo MySQL implementuje RR w inny sposób. Więc co to jest?

EDYTOWANIE: poprzez podobny eksperyment potwierdzono również, że transakcja RR (t1) nie widzi wierszy wstawionych do tej samej tabeli przez inną transakcję RR (t2), jeśli wykona inną opcję w tej tabeli, nawet po zatwierdzeniu t2 i zanim t1 popełni. (Tutaj jest link do tego eksperymentu: http://www.databasejournal.com/features/mysql/article.php/3393161/MySQL-Transactions-Part-II---Transaction-Isolation-Levels.htm)

Czy to znaczy, że RR MySQL zajmuje się również odczytami fantomowymi?

+0

Czy próbowałeś transakcji SERIALIZABLE? http://dev.mysql.com/doc/refman/5.1/en/set-transaction.html#isolevel_serializable – biziclop

+0

Tak, wygląda na to, że serializowany MySQL używa wspólnych blokad odczytu i wyłącznych blokad zapisu, a więc daje impas w powyżej przypadku. Tak więc jestem bardzo zdezorientowany, ponieważ oto, co mówi książka "JP z Hibernate": "System działający w powtarzalnym trybie izolacji odczytu pozwala na odczytanie ani brudne odczyty, co pozwala na odczytanie odczynu fantomowego." Czytanie transakcjiinne transakcje czytania), a transakcje zapisywania blokują wszystkie inne transakcje. " (strona 456) – shrini1000

Odpowiedz

6

MySQL nie jest zgodny z funkcją Powtarzalne czytanie. Możesz go zmusić do działania, używając szeregowania izolacji na poziomie izolacji lub umieszczając FOR UPDATE po wybraniu (patrz przykład poniżej). Wtedy pożądane zachowanie zostanie osiągnięte. chodzi phantom czyta, MySQL jest rzeczywiście bardziej rygorystyczne niż jest to konieczne ...

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

thx! Czy możesz to zrobić? zacytować odniesienie do tego, abym mógł przyjąć to jako odpowiedź? – shrini1000

+4

http://www.cs.umb.edu/~poneil/iso.pdf stwierdza, że ​​utracone aktualizacje nie są możliwe w Powtarzalnym odczycie. Podsumowanie na ostatniej stronie i dyskusję na temat tej specyficznej anomalii znajdziesz gdzieś pośrodku (po prostu szukaj "zagubionej aktualizacji"). Nie mogę podać więcej referencji, mam nadzieję, że na razie wystarczy. – Argeman

+0

Dla pewności: Utracone aktualizacje są w rzeczywistości możliwe w przypadku korzystania z InnoDB z Powtarzalnym Odczytem ze względu na ich niezgodność z implementacją. Czy to prawda? – Basti