Php MySQL在选择更新时锁定整个表,而不是行

Php MySQL在选择更新时锁定整个表,而不是行,php,mysql,concurrency,transactions,innodb,Php,Mysql,Concurrency,Transactions,Innodb,我有一个表名。那张桌子里有许多钥匙。我有一个同时在php上工作的多个守护进程 我希望当一个进程选择一个键时,另一个进程不能为该键选择相同的键 我使用以下代码尝试此场景: <?php $db = new PDO('mysql:host=localhost;dbname=test;charset=UTF-8', 'root', '123456'); try { $db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION

我有一个表名。那张桌子里有许多钥匙。我有一个同时在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();
}
?>

您为什么要启动事务,这在这里是绝对必要的吗?事务的一个特性是,数据在整个事务中保持相同的状态,因此我希望看到这样的锁定。(将有对所选工作的更新查询。我将对处理所选工作的行执行更新查询)