3

私の作品には、複数のユーザーが同時に作業できる でVB.NET書かれた金融アプリケーションがあります。SQL

ある時点で、1 人のユーザーが、自分 (および場合によっては他のユーザー) が現在取り組んでいるエントリのバッチを投稿することを決定する場合があります。

明らかに、Post プロセスが開始された、他のユーザーがそのバッチのエントリを追加編集、または削除することは望ましくありません。

Post プロセスが開始された瞬間に SQL トランザクションを開くことですべてのデータをロックできることは既に確認しましたが、プロセスはかなり長くなる可能性があり、関数を完了するのに数分間かかる可能性があるため、トランザクションを開いたままにしないでください。 .

VB.NET コードから操作する必要があるとわかっているレコードだけをロックする方法はありますか?

4

4 に答える 4

2

Oracleを使用している場合は、ロックしている行の更新を選択します。

ここに例があります

SELECT address1 , city, country
FROM location
FOR UPDATE;
于 2008-09-05T15:48:46.837 に答える
1

特定のテーブル で with (rowlock)を使用するのではなく、トランザクション全体の分離レベルを設定することをお勧めします。

このページを見てください:
http://msdn.microsoft.com/en-us/library/ms173763.aspx

具体的には、その中で「行ロック」を検索すると、READ COMMITTED または REPEATABLE READ が必要なものであることがわかると思います。READ COMMITTED は SQL Server のデフォルトです。READ COMMITTED が十分に強くないように思われる場合は、REPEATABLE READ を使用してください。

更新: フォローアップ投稿の 1 つを読んだ後は、間違いなく繰り返し読みたいと思うはずです。これにより、トランザクションをコミットまたはロールバックするまでロックが保持されます。

于 2008-09-05T16:00:07.997 に答える
0

追加

with (rowlock)

SQLクエリに

SQLServerのパフォーマンスに関する記事

編集:わかりました、私は質問を誤解しました。必要なのはトランザクション分離です。ジョエルに+1:)

于 2008-09-05T15:36:44.200 に答える
0

選択でホールドロック+アップロックを使用してトランでラップします

begin tran
select * from
SomeTable (holdlock,updlock)
where ....


processing here

commit
于 2008-09-09T16:32:56.370 に答える