2

非常に具体的な動作で、悲観的ロックを実装する方法に興味があります。(質問にSybase + Oracle + MSSQLのタグを付けた理由は、それらのいずれかに対して解決策または「それは不可能です!」に満足しているためです)

私が欲しいのはこれです:1-行をロックできるようにする(プロセスが後で更新できるようにするが、他のプロセスが行をロックできないようにする)2-別のプロセスが同じ行をロックしようとすると、レコードがロックされているという通知を受け取る必要があります- このプロセスをハングさせたくありません (単純なタイムアウトをここで使用できると思います)。ダーティリードを使用したい)。

上記の 3 つの要件は、現在、共有メモリを使用し、データベース外でレコード ロックを実行するアプリケーションによって解決されています。ロックをデータベースに移動したいと思います。

これまでのところ、#1 と #3 の間で競合が発生しています。フィールドを同じ値に更新して 'update ...' を実行してレコードをロックすると、別のプロセスからの 'select' がハングします。

編集: MSSQL のスナップショット分離レベルで運が良かったです。ダーティ リードを使用せずに、ロックと読み取りの両方を実行できます。

ダーティ リードを使用したくない理由は、レポートが実行されている場合、複数のテーブルが読み取られ、複数のクエリが発行される可能性があるためです。スナップショットは、データベースの一貫したスナップショットを提供します。ダーティリードでは、途中で更新があった場合、データの不一致が発生します。

Oracleにもスナップショットがあると思うので、今はSybaseに一番興味があります。

4

2 に答える 2

2

Oracleでは、select forupdatenowaitを使用してレコードをロックできます。

select * from tab where id=1234 for update nowait;

別のプロセスが同じステートメントを実行しようとすると、例外が発生します。

ORA-00054: resource busy and acquire with NOWAIT specified

最初のプロセス(セッション)がコミットまたはロールバックを実行するまで。

通常、Oracleはダーティリードを許可しません

于 2012-07-30T17:28:37.070 に答える
0

#1と#3の間で説明されている競合は論理的なものです。データベースにダーティ読み取りを実行させるか、読み取りをブロックすることができます。ロックされた行を読み取ることができれば、それは定義上ダーティな読み取りです。それはあなたが使用する特定のデータベースシステムとは何の関係もありません!

したがって、そのようにしたい場合:はい、「ダーティリード」の定義を損なうため、3つのシステムすべてで必要なことは不可能です。

于 2012-07-30T14:13:03.563 に答える