1

c# アプリケーション。

テーブル内の列の選択に続いて更新を行っています。これらを分離レベルをシリアライズ可能に設定した別のトランザクションに入れています。データの一貫性を確保するためにこれを行っています。

それでも、複数のユーザーが同じ値を読み取る (選択する) ことができ、最終的に同じ値で更新しようとしていることを確認できます。

誰でも一貫性を達成する方法を提案できますか

2 人のユーザーが同じ値を読み取ることはありません。
更新されたがまだコミットされていない値を読み取るユーザーはいません。

4

6 に答える 6

2

これを防ぎたい場合は、悲観的ロックと呼ばれます。(Table|Row) ロックでこれを行うことができますが、パフォーマンスが低下します。

「標準的な」方法は、楽観的並行性を使用して、問題が発生した後で問題を解決することです。

2 人のユーザーが同じ値を読み取ることはありません。

一度に 1 つの接続のみを許可することで、(のみ) これを保証できます。

更新されたがまだコミットされていない値を読み取ったユーザーはいません。

これには、(はるかに軽い) ReadCommitted 分離レベルのみが必要です。

于 2010-07-09T15:54:17.260 に答える
1

Concurrencyについて言及していると思います。それがあなたが求めているものである場合は、リンクをチェックして、それを理解することから始めてください。バックエンドと特定の状況に応じて、おそらくもう少し調査を行う必要があります。繰り返しますが、これが探しているものである場合、悲観的並行性に特に関心があるかもしれません。

http://en.wikipedia.org/wiki/Concurrency_control

.NET での同時実行の問題の処理

于 2010-07-09T15:53:19.260 に答える
1

これを達成するには、さまざまな方法があります。レコードにタイムスタンプを使用できます。更新を行うときは、ID が一致し、アプリケーションがレコードで取得したタイムスタンプが一致することを確認してください。

ユーザーがコミットされていないレコードを読み取らないようにするには、クエリで SQL ヒントを使用する方法を検討してください。

于 2010-07-09T15:54:41.720 に答える
0

stroed procに戻って、アプリケーションから呼び出して更新を行うのはどうですか。

これですべての問題が解決されますか?

于 2010-07-09T17:38:40.347 に答える
0

2 人のユーザーが同じ値を読み取ることはありません。

これを行うには、SET TRANSACTION ステートメントで、RESERVING mytable FOR PROTECTED WRITE (またはデータベース上のローカルの同等のもの) を追加します。

更新されたがまだコミットされていない値を読み取るユーザーはいません。

SERIALIZABLE トランザクションを使用している場合、この問題は発生しません。

于 2010-07-10T08:47:21.890 に答える
0

タスクを達成する 1 つの方法: テーブルに「ロック」フィールドを追加する必要があります。

次に、パラメーターとして ID を受け取るストアド プロシージャを記述し、NULL ロックでアトミックに行を選択し、渡された ID がロックに含まれるように行を更新し、値を返す必要があります。

ストアド プロシージャがアトミックに実行される限り (テーブルに対するその他の要求は、この処理が完了するまで待機します)、このプロシージャを呼び出すすべてのクライアントは、ロック フィールドがまだ空である別の値を取得します。値が返されると、クライアントは、値を含む行のロック フィールドが何らかの値に設定されていることを確信し、返されません。

変更を行った後、行を更新し、新しい値を書き込み、ロック フィールドを NULL に設定して、将来のリクエストのために行を「ロック解除」する必要があります。

于 2010-07-09T16:06:25.440 に答える