Я использую 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? * вернуть до того, как другие операторы будут выполнены с тем же соединением, или до того, как такие операторы полностью вступят в силу?