kakeru-one / web-engineering-roundtable

輪読会用のリポジトリ
10 stars 0 forks source link

lock wait timeoutについて #89

Open kakeru-one opened 3 days ago

kakeru-one commented 3 days ago

https://chatgpt.com/share/674c077b-564c-8008-9303-f2f79613c4b0

kakeru-one commented 3 days ago

Q mysqlで、排他メタデータロックとっている時は、そのテーブルに対してINSERT/UPDATEできないですよね?

Answer

はい、MySQLにおいて排他メタデータロック(MDL)が取得されている間、そのテーブルに対するINSERTやUPDATEなどのデータ操作言語(DML)ステートメントは実行できません。MDLは、テーブルのスキーマ変更やデータの一貫性を保つために使用され、特定のセッションがテーブルに対して排他的な操作を行っている間、他のセッションからの同時アクセスを制限します。

例えば、あるセッションがテーブルに対してALTER TABLEなどのDDL操作を行う際、排他MDLが取得されます。この間、他のセッションからのINSERTやUPDATEなどのDML操作は、MDLが解放されるまで待機状態となります。

このように、排他MDLが取得されている間は、該当テーブルに対するDML操作はブロックされるため、INSERTやUPDATEは実行できません。

https://dev.mysql.com/doc/refman/8.0/ja/metadata-locking.html?utm_source=chatgpt.com


上記は、INSERT/UPDATE文では共有メタデータロックを取ろうとするから競合するから

kakeru-one commented 3 days ago

Q. 共有メタデータロックとっている時は、そのテーブルに対してINSERT/UPDATEできるが、排他メタデータロックは取れないですよね?

Answer

はい、MySQLでは共有メタデータロック(MDL)が取得されている場合、そのテーブルに対してINSERTやUPDATEなどのデータ操作言語(DML)ステートメントを実行することは可能です。しかし、共有MDLが取得されている間は、同じテーブルに対して排他MDLを取得することはできません。これは、共有MDLがテーブルの読み取りや書き込みを許可する一方で、スキーマの変更(例えばALTER TABLEなど)を防ぐためです。

具体的には、あるセッションがトランザクション内でテーブルを参照または更新すると、そのテーブルに対して共有MDLが取得されます。この共有MDLが保持されている間、他のセッションはそのテーブルに対してDML操作を行うことができますが、DDL操作(例えばテーブルの構造変更)は共有MDLが解放されるまで待機する必要があります。

このように、共有MDLが取得されている状態では、INSERTやUPDATEは可能ですが、排他MDLを取得することはできません。

https://korikori-egn.com/db-lock/