このスクリプトには次のものがあります。
$db = new PDO('mysql:host=localhost; dbname=name; charset=utf8', 'user', 'pass');
$db -> exec('LOCK TABLES `table1`, `table2` WRITE');
// Do some stuff here
$db -> exec('UNLOCK TABLES');
問題は、テーブルがロックされていないように見えることです。スクリプトの複数のインスタンスが同時に実行されます。の
// Do something here
LOCK TABLES ステートメントで期待されるように、コードは依然としてアトミックに処理を実行できません。
私は何を間違っていますか?
また、使用する他のテーブル (たとえばtable3
) を明示的にロックしていなくても、読み書きできることに気付きました。mySQLマニュアルによると、それは不可能です。
編集:
この// Do some stuff here
コードは、DB の作業を行うが同じ$db
PDO 接続を共有するいくつかのクラスをインスタンス化します。
私が理解しているように、これは問題の原因ではありません。同じ接続を共有しているからです。ロック テーブル ステートメントは、それらによって「継承」される必要があります。