7

いくつかのテーブルとその中にデータを含むデータベースがあります。すべてのテーブルにオプティミスティック コンカレンシーを実装する必要があります。

どうするのが一番いいのか考えてみました。

述語を含むクエリは、アプリケーション側で作成されます。

私の懸念は、rowversion(timestamp) 値を格納する方法です。

最初は、rowversion 値にora_rowscnを使用することを考えていましたが、 ora_rowscnを設定するにはすべてのテーブルを再作成する必要があることに気付きました。ある種のタイムスタンプ列を追加するだけでもよいかもしれませんが、そうすると、アプリケーションの更新ごとに新しいタイムスタンプ値を作成して保存する必要があります。

何か案は ?

4

2 に答える 2

7

Oracle には、OWA_OPT_LOCKと呼ばれる楽観的ロック用の組み込みパッケージがあります。これを使用して、次のように任意の行のチェックサムを生成できます。

select owa_opt_lock.checksum('SCOTT','EMP',ROWID)
from emp
where empno = 123;

これは、最初にレコードを取得するときと、変更を保存する前に再度呼び出すことができます。2 つの値が異なる場合は、レコードを取得してから他の誰かがレコードを変更しています。

于 2011-06-21T14:38:18.883 に答える
4

非常に単純ですが効果的なパターンは、ロックを保持せずに、編集しようとしている行全体を最初にフェッチすることです。最終的に更新の準備ができたら、 where 句を のような句で拡張しCOLUMNA='OLDVALUEA'ます。変更されたレコードの数は、他の変更が楽観的更新を妨げたかどうかを示します。

このメソッドは、更新を試みたときにまだ有効なすべての変更を通知します。チェックサムに依存する方法は、変更が行われていないことを誤って示す可能性があります。必要な信頼性は、アプリケーションによって異なります。チェックサムに人の命を賭けるつもりはありません。ただし、この場合も楽観的な更新に頼らないようにします。

于 2011-06-21T14:55:12.553 に答える