MySQL release_lock () блокируется? - PullRequest
0 голосов
/ 25 марта 2020

Я использую MySQL:

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

Мое Go приложение выполняет некоторые миграции схемы , которые начинаются с SELECT GET_LOCK() и затем выполняет кучу DDL и других операторов, за которыми следует SELECT RELEASE_LOCK(). Все эти запросы выполняются для одного и того же соединения.

Я наблюдаю сценарий, в котором драйвер миграции возвращает успех (блокировка снята), но сразу после следующих вызовов SQL отображается изображение база данных, которая только частично перенесена. Вызовы через несколько мс видят полностью перенесенную схему.

Я прочитал документацию по этим MySQL функциям. Я понимаю, что они создают / уничтожают «консультативную блокировку», которая не может предотвратить одновременный доступ к данным, за исключением случаев, когда два приложения используют одно и то же имя для блокировки.

У меня вопрос, возможно ли это для * 1020? * вернуть до того, как другие операторы будут выполнены с тем же соединением, или до того, как такие операторы полностью вступят в силу?

Ответы [ 2 ]

3 голосов
/ 25 марта 2020

Если вы имеете в виду, что вы выполняете:

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

И они запускаются последовательно в одном потоке, то нет, RELEASE_LOCK () не может быть запущен до завершения операторов DDL.

Фактически, сами операторы DDL блокируются. Они не возвращаются, пока не закончится DDL.

Я подозреваю, что у вас происходит одно из следующих действий:

  • Некоторые операторы DDL не были выполнены успешно, но вы не проверяете их статус ошибки.
  • Вы пытаетесь использовать несколько потоков, и вы каким-то образом позволили RELEASE_LOCK () работать до завершения потока DDL.
0 голосов
/ 25 марта 2020

Ваш сеанс, вероятно, закончился рано, потому что

Блокировка, полученная с помощью GET_LOCK (), освобождается явно при выполнении RELEASE_LOCK () или неявно, когда ваш сеанс завершается (либо нормально, либо ненормально) . Блокировки, полученные с помощью GET_LOCK (), не снимаются при фиксации или откате транзакций.

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...