私は IBM DB に取り組んでいますが、概念はほとんど同じだと思います。
1 行をフェッチし、これらのデータを返し (または変数に保存してみましょう)、その特定の行のいくつかのフィールドを更新したいと考えています。そのクエリを同時に実行しようとするインスタンスが多数存在する可能性があるため、フェッチ操作をアトミックにする必要があります。
各行には、pending と呼ばれるフィールドがあり、FALSE に初期化されます。1 つのインスタンスがこの行をフェッチすると、これが TRUE に設定されます (これが私が実行したい更新です)。あまりにもアトミックである必要がある理由は、保留中が FALSE であるテーブルの最初の行をクエリがフェッチするためです。
擬似コードでは、次のようなものがあります:
OPEN_DB(myDb, "DBNAME"); // opening the DB
BEGIN_TRANSACTION(myDb); // beginning transaction on my db
EXECUTE_QUERY(myDb,"SELECT * FROM tbname WHERE pending == 0 ORDER BY colid LIMIT 1");
... assign a cursor to my results
while (valid_data) {
// assign column fields to variable
// and here i want to do the update for this column
// I guess the problem is here
EXECUTE_QUERY(myDb,"UPDATE tbname SET pending = 1 WHERE colid=@colid")
}
COMMIT();
構文について心配する必要はありません。これらはマクロであり、単独で実行されると機能します。問題は2番目のクエリにあると推測していますが、なぜですか?
- 最初にコミットしてから、2 番目のクエリを実行する必要がありますか?
- はいの場合、更新する前に同じ行を読み取るインスタンスが他にないようにするにはどうすればよいですか?
これは、私が使用しているDBとは関係がないと思います。
2番目のものにコメントすると、コードが機能します。2 番目のものをスタンドアロンで実行すると、同様に機能します。