Wycofanie MySQL przy transakcji z utraconym / rozłączonym połączeniem
Muszę zmusić serwer MySQL do wycofania transakcji natychmiast po odłączeniu klienta, ponieważ każdy klient działa jednocześnie. Problem można odtworzyć w ten sposób (używając typu tabel innodb)
Na Kliencie A:
START TRANSACTION;
SELECT MAX(ID) FROM tblone FOR UPDATE;
#... then disconnect your connection to the server
Na Kliencie B:
START TRANSACTION;
SELECT MAX(ID) FROM tblone FOR UPDATE;
#... lock wait time out will occur here
Ustawiłem opcję serwera MySQL jak innodb_rollback_on_timeout
i używałem klienta mysql mysql --skip-reconnect
na obu klientach. Próbowałem tego używając jednego serwera i dwóch klientów, w sieci. Fizycznie odłączyłem sieć (odłączyłem Kabel) po linii SELECT ... FOR UPDATE;
. Muszę sprawić, aby inni klienci mogli używać tblone
na transakcji (zablokować ją, zaktualizować) natychmiast, i aby tak się stało, myślę, że serwer powinien wycofać transakcję dla Klienta a, po tym, jak klient A się rozłączy.
1 answers
Kiedy fizycznie odłączasz klienta, nie wysyłasz normalnego rozłączenia (co spowodowałoby wycofanie), a protokół MySQL nie jest zbyt rozmowny, więc serwer nigdy nie wie, że Klienta tam nie ma. Myślę, że jest to wada Protokołu w porównaniu do innych systemów bazodanowych, w których klient i serwer rozmawiają wewnętrznie znacznie więcej.
W każdym razie. Istnieją dwie zmienne, które można zmienić. Zasadniczo robią to samo, ale dla różnych klientów.
The pierwszy to wait_timeout i jest używany przez klientów aplikacji, takich jak java lub php.
Drugi to interactive_timeout i jest używany przez klienta mysql (jak w testach)
W obu przypadkach serwer zabija połączenie po kilku sekundach i robiąc to wycofuje wszystkie transakcje i zwalnia wszystkie blokady.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-04-08 05:57:47