テーブルロックとかかけているのかな?と思って追ってみた。
処理の様子
ロックがサポートされていたらロックをかけるようす。
Advisory Lockという概念が出てきた。「助言ロック」という概念らしい。
MySQLアダプタのsupports_advisory_locks?
MySQLはその仕組みがある、とされている。
ロックを取得して、解放するようになっている。
generate_migrator_advisory_lock_id
ロックのキーはcurrent_database
から生成されている。
MySQLのget_advisory_lock, release_advisory_lock
MySQLの場合はGET_LOCK
RELEASE_LOCK
で為されている。
これらは、引数の文字列の一致でロックを同定するようだ via: MySQLのロック機能
結論
- テーブルロックではない
- MySQLのDatabase単位で、ロックを取得するようになっているが、あくまでRailsのmigration同士がぶつからないようにするため
- 他の手段(mysqlコマンド直とか)で触ることはできる
ちなみに
postgresqlも、supports_advisory_locks
はtrue
で、実装としてpg_try_advisory_lock
を使うようだ。