キーとなるテーブル名があります。そのテーブルには多くのキーがあります。そして、私は同時にphpで動作する複数のデーモンプロセスを持っています。
プロセスがキーを選択するときに、別のプロセスがそのキーに対して同じキーを選択できないようにしたいと思います。
私はこのコードでこのシナリオを試します:
<?php
$db = new PDO('mysql:host=localhost;dbname=test;charset=UTF-8', 'root', '123456');
try {
$db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
$db->exec("SET autocommit=0;");
$db->beginTransaction();
$stmt = $db->query("SELECT * FROM keys WHERE resetTime IS NULL OR resetTime > ' . time() . ' LIMIT 0,1 FOR UPDATE");
$rows = $stmt->fetchAll(PDO::FETCH_ASSOC);
echo("rows: " . print_r($rows,true));
//sleep(20);
/*
update command will be here for selected row
*/
$db->commit();
} catch(PDOException $ex) {
//Something went wrong rollback!
$db->rollBack();
echo $ex->getMessage();
}
?>
このシナリオでは、phpコマンドで2ターミナルウィンドウを使用します。最初のコマンドでは、トランザクションを待機しているため、スリープ行のコメントを解除します。
2番目のウィンドウで、スリープラインにコメントを付け、同じコードを実行します。ただし、最初のプロセスが別の行を選択するのを待ちます。(キーテーブルには、resetTimeがnullである多くの行があります)
各プロセスが単一のキーを選択する(そして、選択したキーを自分で更新した後)この操作をどのように実現できますか?