我正在对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更新会锁定数据库吗?这是进行此类更新的正确方法吗?
答案 0 :(得分:5)
首先,在 minimum ,您应该执行SELECT ... FOR UPDATE
,以便锁定其他SELECT ... FOR [SHARE|UPDATE]
访问权限。您必须在事务中执行此操作并保留该事务,直到您更新最后一行commit
。
SELECT ... FOR UPDATE
不的行与正常SELECT
锁定;对于未使用FOR UPDATE
或FOR SHARE
的其他交易,它们仍可读取。
更好的是,尝试将整个事物重新定义为UPDATE ... FROM
或其他基于集合的操作,您可以在单个查询中完成所有工作。它通常比SELECT ... FOR UPDATE
大得多,后跟UPDATE
s流。