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

时间:2012-12-05 09:02:01

标签: 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);
    $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终端窗口。在第一个命令中,我取消注释睡眠行,因为等待事务。

在第二个窗口中,注释睡眠行并执行相同的代码。但是,它等待第一个进程选择另一行。 (keys表有很多行,resetTime为null)

如何实现此操作,即每个进程选择一个密钥(并在更新后为所选密钥更新)

0 个答案:

没有答案
相关问题