<?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