1

PDO でテーブルに対してアクションを実行する前にテーブルをロックしたいので、2 人のユーザーが同時に同じアクションを実行することはできません。

私は次のように試しました:

$this -> link ->beginTransaction();
$this -> link ->exec('LOCK TABLES `MYTABLE` WRITE;');
//do something...
$this -> link ->exec('UNLOCK TABLES');
$this -> link ->commit();

ただし、2 人のユーザーがこのクエリを試行すると、両方ともスタックします。私は何を間違っていますか?

ありがとう!!

4

1 に答える 1

0
<?php
$this->link->beginTransaction();
$this->link->query('select yourcolumn from yourtable where yourcondition for update');
sleep(20);
$this->link->commit();

次に、mysql ワークベンチを開き、次のコマンドを実行してみてください。

begin;
select count(yourcolumn) from yourtable where yourcondition for update;
// will lock here

常にトランザクションを開いて、列データを選択するときにselect for updateを使用することを覚えておいてください

ワークベンチで以下を実行すると(上記のphpスクリプトが実行されている間)、ロックによって保護されている以下をテストしました。

update yourtable set yourcolumn=yourvalue where yourcondition;
// will lock here because php has obtained lock, no need to use transaction here

ただし、ワークベンチで以下を実行すると (上記の php スクリプトが実行されている間)、以下はロックによって保護されません。

select yourcolumn from yourtable where yourcondition;
// will immediately return resulset because you are not using transaction AND "for update"

さらに、beginTransaction が使用されているすべてのコードを確認することもできます。これは、実行時間の長いトランザクションが長時間のテーブル ロックを引き起こすためです。例としては、インポート ファイル操作でのトランザクションのみです。最初のレコードをテーブルに挿入すると、テーブルはロックされます。

begin;
insert into yourtable values yourvalues;
// will acquire lock here, other mysql workbench will be deadlock
// until your whole import operation is done and rollback/commit your upload
于 2013-10-21T03:29:39.637 に答える