我在对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更新是否会锁定数据库?这是进行这种更新的正确方法吗?
首先, 至少 您应该这样做,以SELECT ... FOR UPDATE防止其他SELECT ... FOR [SHARE|UPDATE]访问锁定行。您必须在事务内执行此操作并保持该事务,直到更新最后一行和commit。
SELECT ... FOR UPDATE
SELECT ... FOR [SHARE|UPDATE]
commit
您SELECT ... FOR UPDATE 未 锁定普通行的行SELECT;他们仍然可以读取未使用FOR UPDATE或的其他交易FOR SHARE。
SELECT
FOR UPDATE
FOR SHARE
更好的是,尝试将整个事情重新表述为一个UPDATE ... FROM或其他基于集合的操作,在此操作中您可以在单个查询中完成所有工作。通常,它的性能要好于SELECT ... FOR UPDATE随后的UPDATEs 流。
UPDATE ... FROM
UPDATE