2

我正在对 Postgres 数据库使用 github.com/bmizerany/pq。我需要选择“todos”表中的所有行,并为每一行检查条件并相应地更新该行。伪代码:

rows, _ := dbConn.Query("SELECT id, condition, task FROM todos")

for rows.Next() {
    var Id int
    var Condition int
    var Task string
    rows.Scan(&Id, &Condition, &Task)
    if Condition == 0 {
           UpdateTask(Id, Task)
    }
}

UpdateTask() 函数将发出一条 SQL 更新语句来更新行。

在 SELECT 查询中发布 SQL 更新会锁定数据库吗?这是进行此类更新的正确方法吗?

4

1 回答 1

6

首先,您至少应该这样做,SELECT ... FOR UPDATE以便将行锁定以防止其他SELECT ... FOR [SHARE|UPDATE]访问。您必须在事务中执行此操作并保留该事务,直到您更新最后一行和commit.

SELECT ... FOR UPDATE 没有锁定正常的行SELECT;它们对于其他不使用FOR UPDATEor的事务仍然是可读的FOR SHARE

更好的是,尝试将整个事情重新表述为一个UPDATE ... FROM或其他基于集合的操作,您可以在单个查询中完成所有工作。SELECT ... FOR UPDATE它通常比 a后跟 s 流的性能要好得多UPDATE

于 2013-08-11T10:39:09.683 回答