小编典典

SQL选择和更新的正确方法

go

我在对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更新是否会锁定数据库?这是进行这种更新的正确方法吗?


阅读 350

收藏
2020-07-02

共1个答案

小编典典

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

SELECT ... FOR UPDATE 锁定普通行的行SELECT;他们仍然可以读取未使用FOR UPDATE或的其他交易FOR SHARE

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

2020-07-02