0

これは、古典的な同時読み取りと書き込みの課題です。

Hibernate を介して Oracle データベースにレコードと Atom Hopper フィードを公開しており、パートナーがそれらを読み取っています。レコード 1 から 5 までを公開すると、5 が先頭 (つまり、最後に公開されたもの) になります。パートナーはエントリ 1 から始まるフィードのページを要求し、エントリ 1 ~ 5 を受け取ります。次回彼らが尋ねるとき、彼らはエントリ 5 よりも新しいエントリを要求します。クライアントは、どのエントリが読まれたかを追跡します。

問題は、彼らが読んでいる間に、たまたまエントリ番号 6 を公開したことです。これは、「作成済み」列の番号 5 よりもわずかに古いタイムスタンプを取得します。読み取り後にコミットされたため、パートナーが nr を取得することはありません。6. その間に公開した 7、8、9 を取得します。すべて nr よりも新しいタイムスタンプです。5.

では、nr のようなエントリの欠落をどのように回避するのでしょうか。6? 最初の手段としてデータベースにタイムスタンプを設定させますが、レコードがタイムスタンプを取得してからコミットされるまでの間に無視できない時間が存在するため、読み取り中に「古い」エントリをコミットする可能性がまだあります。 . 読み取りなどのためにデータベースページをロックすることは可能でしょうか?

クライアントの動作を変更する必要があるかもしれないと考えています。つまり、間にコミットがあった場合に備えて、4 番よりも新しいエントリを要求します。タイムスタンプの代わりにシーケンスを使用すると、nr. 6?

4

0 に答える 0