主キーを持つ単純なテーブルがあります。読み取り操作のほとんどは、キーの正確な値によって 1 つの行をフェッチします。
各行のデータは、キーの順序でその前後の行と何らかの関係を維持しています。したがって、新しい行を挿入するときは、間に入る2行を読み取り、計算を行ってから挿入する必要があります。
懸念事項は、明らかに、別の接続が同じ間隔でキー値を持つ行を同時に追加する可能性があることです。2 番目の挿入が失敗するのとまったく同じキーの値である場合はカバーされますが、キーの値が異なるが同じ間隔である場合、関係が壊れる可能性があります。
解決策は、新しい行を追加することを決定したときに書き込み用にテーブル全体をロックするか、(可能であれば、疑わしい) キー値の間隔をロックすることです。それでも、その時点で読み取り専用トランザクションがブロックされないようにしたいと思います。
クライアント プログラムと IBM DB2 フリー エディションで C++ 用の libodbc++ ラッパーを使用して ODBC を使用しています (ただし、DB の選択は変更される可能性があります)。これは私がやろうと思ったことです:
- 自動コミットとデフォルトの分離モードで接続を開始します
- 新しい行を追加する必要がある場合は、auto-commit を false に設定し、分離モードを serialized に設定します
- 新しいキー値の前後の行を読み取る
- 新しい行を計算して挿入する
- 専念
- 自動コミットとデフォルトの分離モードに戻る
これは仕事をしますか?他のトランザクションは同時に読み取ることができますか? それを行う他の/より良い方法はありますか?
ところで、libodbc++ i/fa で読み取り専用トランザクションを指定する方法がわかりません。odbcで可能ですか?
編集:非常に有用な回答をありがとう、私は1つを選択するのに苦労しました.