1

キーとなるテーブル名があります。そのテーブルには多くのキーがあります。そして、私は同時に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である多くの行があります)

各プロセスが単一のキーを選択する(そして、選択したキーを自分で更新した後)この操作をどのように実現できますか?

4

0 に答える 0