6

オラクルのブロックについて少し理解しています - トランザクションが完了するまで更新が他の更新をブロックする方法、ライターがリーダーをブロックしない方法など。

悲観的ロックと楽観的ロックの概念、および失われた更新を失うことに関する典型的な銀行の教科書の例などを理解しています。

また、JDBC トランザクションの分離レベルについても理解しています。たとえば、コミットされていないデータが表示されることに満足しています。

ただし、これらの概念がどのように関連し、相互作用するかについては、少しあいまいです。例えば:

  • Oracle はデフォルトで悲観的ロックまたは楽観的ロックを提供していますか (2 つの TOAD セッションでの実験に基づいて、個別の更新をブロックしているように見えます)。
  • 私が思うに、これらがアプリケーション レベルの概念であるとすれば、とにかくデータベースにトランザクションの更新を同期させることができるのに、ロック戦略を実装するのに苦労するのはなぜでしょうか?
  • アプリケーション以外の他のクライアントが異なる分離レベルでアクセスしている場合、トランザクション分離レベル (接続で設定) はデータベースの動作をどのように変更しますか。

これらのトピックを明確にするための言葉をいただければ幸いです。

4

3 に答える 3

3
  • Oracle では、どちらのタイプのロックも許可しています。アプリケーションの構築方法によって、何が使用されるかが決まります。振り返ってみると、それは実際にはデータベースの決定ではありません。

  • ほとんどの場合、データベースへのステートフル接続では Oracle のロックで十分です。ステートフルでないアプリ (Web アプリなど) では使用できません。ロックはセッションに適用されるため、このような状況ではアプリケーション レベルのロックを使用する必要があります。

  • 通常は気にする必要はありません。Oracle では、リーダーがライターをブロックすることはなく、ライターがリーダーをブロックすることもありません。Oracle の動作は、さまざまな ANSI 分離レベルで変わりません。たとえば、Oracle には「ダーティ リード」などはありません。Tom Kyte は、ダーティ リードを許可する精神は、Oracle では問題とならない読み取りのブロックを回避することにあると指摘しています。

Tom Kyte の優れた本「Expert Oracle Database Architecture」を読むことを強くお勧めします。この本では、これらのトピックやその他のトピックが非常に明確に扱われています。

于 2010-08-06T18:16:17.090 に答える
2

楽観的ロックとは、基本的に「データを読み取るときではなく、データを変更するときにのみデータをロックする」ことです。落とし穴は、データをすぐにロックしないと、他の誰かがデータを変更してから古いニュースを見ている可能性があることです(そして、データを読んで更新するまでの間に起こった変更を盲目的に上書きする可能性があります。 )。

ペシミスティックロックとは、データを読み取るときにデータをロックすることです。これにより、データを更新することにした場合でも、誰もデータを変更していないことを確認できます。

これはアプリケーションの決定であり、次のようなOracleの決定ではありません。

SELECT x、y、z FROM table1 WHERE a = 2

一致するレコードはロックされませんが

SELECT x、y、z FROM table1 WHERE a = 2 FOR UPDATE

意思。したがって、楽観的ロックで大丈夫かどうかを判断する必要があります

SELECT x, y, z FROM table1 WHERE a = 2

...時を経て...

UPDATE table1
   SET x = 1, y = 2, z = 3
 WHERE a = 2

(その間に他の誰かが行った変更を上書きした可能性があります)

または悲観的である必要があります:

SELECT x, y, z FROM table1 WHERE a = 2 FOR UPDATE

...時を経て...

UPDATE table1
   SET x = 1, y = 2, z = 3
 WHERE a = 2

(データを照会してから、誰もデータを変更していないことを確認してください。)

Oracleで利用可能な分離レベルについては、こちらを確認してください。 http://download.oracle.com/docs/cd/B19306_01/server.102/b14220/consist.htm#CNCPT621

于 2010-08-06T18:23:22.607 に答える
1

Oracle は常に悲観的ロックを処理します。つまり、更新時にレコードをロックします (また、キーが関係している場合は、削除と挿入のためにロックを押すこともできます)。SELECT....FOR UPDATE を使用して、悲観的なロック戦略を強化できます。

実際、トランザクション的に動作するデータベース/ストレージ エンジンは、なんらかの形式のロックを行う必要があります。

SERIALIZABLE 分離レベルは、楽観的なロック メカニズムに非常に近いものです。トランザクションが、トランザクションの開始以降に更新されたレコードを更新しようとすると、例外がスローされます。ただし、データベース セッションとエンド ユーザー セッション間の 1 対 1 に依存します。

接続プーリング/ステートレス アプリケーションが普及するにつれ、特にユーザー アクティビティが多いシステムでは、データベース セッションを長時間拘束することは適切な戦略とは言えません。オプティミスティック ロックが推奨され、Oracle の新しいバージョンでは ORA_ROWSCN および ROWDEPENDENCIES アイテムでこれがサポートされます。基本的に、最初/最後に見た後にレコードが変更されたかどうかを簡単に確認できます。

データベース セッションとユーザー セッション間の 1 対 1 の関係がレガシーになるにつれて、アプリケーション レイヤーは「ユーザー セッション」の状態をより多く保存するようになり、ユーザーが行った 5/10 の選択をチェックする責任がより大きくなります。数分前はまだ有効です (たとえば、その本はまだ在庫があるか、他の人が購入したかなど)。

于 2010-08-07T01:13:58.087 に答える