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 update を発行すると、データベースがロックされますか? これは、そのような更新を行う適切な方法ですか?

4

1 に答える 1

6

まず、少なくともSELECT ... FOR UPDATE、他のアクセスに対して行をロックする必要がありSELECT ... FOR [SHARE|UPDATE]ます。これをトランザクション内で実行し、最後の行と を更新するまでそのトランザクションを保持する必要がありますcommit

通常に対してロックしてSELECT ... FOR UPDATE いないSELECTFOR UPDATEまたはを使用していない他のトランザクションからは引き続き読み取り可能ですFOR SHARE

UPDATE ... FROMさらに良いのは、単一のクエリですべての作業を行う、またはその他のセットベースの操作として全体を言い換えてみることです。通常、 のSELECT ... FOR UPDATE後に s のストリームが続くよりもはるかに優れたパフォーマンスを発揮しますUPDATE

于 2013-08-11T10:39:09.683 に答える