2011-08-08 7 views
9

Jestem Working around MySQL error “Deadlock found when trying to get lock; try restarting transaction”MySQL JDBC: Czy istnieje opcja automatycznego ponawiania po zakleszczeniu InnoDB?

I okazało się, że transakcja może być bezpiecznie reattempted

zakleszczenia nie są niebezpieczne. Po prostu spróbuj ponownie.
http://dev.mysql.com/doc/refman/5.0/en/innodb-deadlocks.html

Jest tylko jedno „super insert..select” oświadczenie, że wstawiane do tabeli wąskiego gardła po wybraniu dołączył combo dwóch innych tabel i przy użyciu zwrotów warunków sub na stole wąskiego gardła, a także kilka maleńkich stolików.

Szyjka butelki "czekała na zamek", czekała na blokadę zapisu bez wątpienia. InnoDB wydawało się idealnie dopasowane. (dla stołu z dużym ciężarem pisania) A teraz wahania w tym jednym stwierdzeniu zniknęły.

Ale teraz pojawia się problem: na każde 100 egzekucji oświadczenia, 1 lub 2 z nich zakończy się niepowodzeniem z powodu impasu. Uważam, że impas występuje tylko między instancjami "super insert..select". Będę zainstalować powtórzenie auto z tym stwierdzeniem, ale zastanawiałem

Pytanie: Czy MySQL JDBC ma możliwość włączenia automatycznego ponownego oświadczenia po otrzymaniu wyjątek, czy też muszę napisać własny kod że?

com.mysql.jdbc.exceptions.MySQLTransactionRollbackException: Deadlock found when trying to get lock; try restarting transaction 

W tym przypadku nie mam poleceń rozpoczęcia transakcji ani zatrzymania transakcji. Tylko jedna instrukcja "super insert..select"

Odpowiedz

5

Możesz powtórzyć instrukcję, ale w idealnym świecie powinieneś wycofać transakcję i zacząć od nowa. A twoje transakcje byłyby krótkie w tym świecie :)

+3

Przyjmuję, że odpowiedź brzmi: nie. –

+0

@GeorgeBailey Odpowiedź jest ponowną próbą całej transakcji, a nie tylko wyciągu. – EJP