2

このスクリプトには次のものがあります。

$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 の作業を行うが同じ$dbPDO 接続を共有するいくつかのクラスをインスタンス化します。

私が理解しているように、これは問題の原因ではありません。同じ接続を共有しているからです。ロック テーブル ステートメントは、それらによって「継承」される必要があります。

4

1 に答える 1

0

あなたの構文は少しずれています。WRITE各テーブル名の後に追加:

$db -> exec('LOCK TABLES `table1` WRITE, `table2` WRITE');
于 2013-10-15T12:19:43.797 に答える