我有一个键的表名。该表中有许多键。而且我有一个同时处理 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();
}
?>
在这种情况下,我使用 2 个终端窗口和 php 命令。在第一个命令中,我取消注释睡眠行,因为等待事务。
在第二个窗口中,注释 sleep 行并执行相同的代码。但是,它等待第一个进程选择另一行。(keys 表中有很多行 resetTime 为空)
我怎样才能实现这个操作,每个进程选择一个键(并在为自己更新选择的键之后)