Używam MySQL:

~/g/profile> mysql --version
mysql  Ver 14.14 Distrib 5.7.28, for osx10.13 (x86_64) using  EditLine wrapper

Moja aplikacja Go wykonuje migracje schematów, co zaczyna się od SELECT GET_LOCK(), a następnie wykonuje kilka poleceń DDL i innych oświadczenia, po których następuje dokumentację na tych funkcjach MySQL. Rozumiem, że tworzą one / niszczą „blokadę doradczą”, która nie ma uprawnień do zapobiegania równoczesnemu dostępowi do danych, z wyjątkiem sytuacji, gdy dwie aplikacje używają tej samej nazwy blokady.

Moje pytanie brzmi: czy jest możliwe, aby RELEASE_LOCK() powróciło przed innymi instrukcjami wykonanymi z tym samym połączeniem lub zanim takie instrukcje w pełni zaczną obowiązywać?

0
Matt Mc 25 marzec 2020, 01:02

2 odpowiedzi

Najlepsza odpowiedź

Jeśli masz na myśli, że biegasz:

GET_LOCK()
...some DDL statements...
RELEASE_LOCK()

Są one uruchamiane szeregowo w jednym wątku, więc nie, nie jest możliwe, aby RELEASE_LOCK () działał przed zakończeniem instrukcji DDL.

W rzeczywistości same instrukcje DDL blokują. Nie wracają, dopóki DDL nie zostanie zakończona.

Podejrzewam, że zachodzi jedna z następujących sytuacji:

  • Niektóre instrukcje DDL nie powiodły się, ale nie sprawdzasz ich statusu błędu.
  • Próbujesz użyć wielu wątków i w jakiś sposób pozwoliłeś RELEASE_LOCK () na uruchomienie przed zakończeniem wątku DDL.
3
Bill Karwin 24 marzec 2020, 22:14

Twoja sesja prawdopodobnie zakończyła się wcześniej, ponieważ

Blokada uzyskana za pomocą GET_LOCK () jest zwalniana jawnie przez wykonanie RELEASE_LOCK () lub niejawnie, kiedy twoja sesja kończy się (normalnie lub nienormalnie) . Blokady uzyskane za pomocą GET_LOCK () nie są zwalniane podczas zatwierdzania lub wycofywania transakcji.

https://dev.mysql.com/doc/refman/8.0/en/locking-functions.html

0
nbk 24 marzec 2020, 22:14