我可以使用PDO执行并发请求和修改

时间:2012-04-04 13:09:32

标签: php pdo

我有一个包含大量数据的mysql表。此表中的所有行都需要以一种在纯SQL中不易表达的方式修改一个字段。

我希望能够逐行循环遍历表,并逐个更新所有条目。 但要做到这一点,我会做类似的事情:

$sql = "SELECT id,value FROM objects";
foreach ($dbh->query($sql) as $row)
{
    $value = update_value( $row['value'] );
    $id = $row['id'];
    $update_sql = "UPDATE objects SET value='$value' WHERE id=$d";
    $dbh->query( $update_sql );
}

这会做坏事吗? (除了可能很慢?)

澄清:特别是我担心第一次选择使用游标,而不是在foreach中的一次命中中检索所有数据,然后 由于循环内部的更新导致游标失效,我不知道。如果有一些规则,例如“在用另一个光标扫描时不要更新同一个表”,它可能只会出现在巨大的表格上,所以我执行一个小的测试用例几乎没用。

如果有人可以指向我说这样做是正常的,而不是以这种方式工作的特殊问题,那也很棒。

2 个答案:

答案 0 :(得分:0)

好像你有两个选择:

  1. (直接):在开始循环之前,使用类似'fetchAll'的内容来获取第一个查询的所有结果。这将有助于防止游标重叠。
  2. (更加模糊):更改此项以使用存储的函数(代替'update_value'),这样您就可以将两个查询转换为单个'update objects set value = some_function(id)'
  3. 根据尺寸和持续时间的不同,您可能需要事先锁定所有内容。

答案 1 :(得分:0)

单个查询的结果是一致的,因此更新不会影响它。请记住:

  1. 使用准备好的陈述;它会减少进程和数据库之间的流量,因为每次只传输值而不是整个查询。

  2. 如果您担心同时运行其他进程,则应使用事务和正确锁定,例如

    // transaction started
    SELECT id,value 
    FROM objects 
    LOCK IN SHARE MODE
    
    // your other code
    
    // commit transaction