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