我可以执行并发请求和改性中使用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内,再有是什么我不知道造成循环内的更新游标失效。 如果有一些类似的规则很可能只会出现在硕大表“,而与另一个光标扫描它不更新的同桌”,所以我进行一个小的测试案例几乎是无用的。

如果有人能指出我该说这样做是确定的,而不是用这种方式工作的一个特殊问题的文档,这也将会是巨大的。

--------------解决方案-------------

单个查询的结果是一致的,所以更新不会影响它。 要牢记:

  1. 用准备好的发言; 它会降低你的过程和数据库之间的通信量,因为只有值被传代替每次整个查询。
  2. 如果你担心在同一时间运行的其他进程,你应该使用交易和适当的锁,如

    // transaction started
    SELECT id,value
    FROM objects
    LOCK IN SHARE MODE

    // your other code

    // commit transaction

好像你有两个选择权出了大门:

  1. (直进):使用类似'使用fetchall'开始通过它循环之前得到第一个查询的所有结果。 这将帮助你保持重叠游标。
  2. (比较模糊):将其更改为使用存储功能(在地方'update_value“的),所以你可以把两个查询到一个单一的”更新对象的设定值= some_function(ID)“

根据这个大小和持续时间,你可能需要事先锁定的一切。

分类:php 时间:2015-03-15 人气:0
本文关键词: PHP,PDO
分享到:

相关文章

Copyright (C) 55228885.com, All Rights Reserved.

55228885 版权所有 京ICP备15002868号

processed in 2.536 (s). 10 q(s)