正确的SQL选择和更新方式

时间:2013-08-11 10:34:28

标签: sql postgresql 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更新会锁定数据库吗?这是进行此类更新的正确方法吗?

1 个答案:

答案 0 :(得分:5)

首先,在 minimum ,您应该执行SELECT ... FOR UPDATE,以便锁定其他SELECT ... FOR [SHARE|UPDATE]访问权限。您必须在事务中执行此操作并保留该事务,直到您更新最后一行commit

SELECT ... FOR UPDATE 的行与正常SELECT锁定;对于未使用FOR UPDATEFOR SHARE的其他交易,它们仍可读取。

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