2010-12-14 8 views
0

私はC#でアプリケーションを開発しました。フォームには、リストビューコントロールの従業員の詳細が表示されます。ユーザーが行をクリックすると、別のフォームが開き、その従業員のレコードが詳細に表示されます。Sqlサーバの行ロック

従業員のレコードがより詳細に表示されているフォームが表示され、そのレコードがロックされ、別のユーザーが元のレコードを見るまでそのレコードを見ることができないようにしたいユーザーが詳細フォームを閉じます。このタイプのアプリケーションをSQL Serverのロックでどのように設計できるか教えてください。行のために

+4

行を編集するとロックを取得することをお勧めします。すべての時代のレコードは、ロックを取得するだけで見て、あなたのDBのパフォーマンスに影響を与えます。ロックされているとレコードが見えないことが本当に必要ですか?ロックされていると編集できません。 – kevpie

答えて

0

あなたが使用できるロック:

BEGIN TRANSACTION 
UPDATE someTable set SomeThing = 'new value' where someID = 1 
-- this will lock 'someTable' in affected row as long as transaction alive. 

-- in another connection 
select * from someTable with (readpast) 
-- this will skip locked rows 

が、これは実装するための適切な方法ではないことに留意してください。

  • ユーザーは、システムをパニックにしてデータを失うか、バグだと言うかもしれません。
  • 行をロックするときは、接続/トランザクションがタイムアウトするまで、またはユーザーがその行をコミットするまでロックされることに注意してください。
  • 接続プーリングがありません。
  • リモート接続のため、ウェブアプリの考えが悪い
  • with (readpast)ステートメントなしのsomeTableを含むクエリはすべて待機する必要があります。

編集ビューでユーザーに「表示」させてください。キャッシング編集行のためのASP.NETでは:

Application[string.Format("{0}.{1}", tableName, primaryKey)] = true; 
+0

'with(updlock)'を選択するだけで、読み込んだ行をロックすることができます。ただ1つの行だけを読むようにしてください。そして、はい、これは並行処理には恐ろしいことです。 – Donnie

2

好ましい方法は...

あなたがテーブルにタイムスタンプ列を追加し、着信アップデートと比較することができだろう。

ユーザーがデータを更新しようとしたときにタイムスタンプが異なる場合は、データが変更されたことをユーザーに警告し、画面を更新します。

非好ましい方法は...

テーブルにuserEditing列を追加し、(チェックアウトのような)行と協力してユーザに設定されることになります。この行を「チェックアウト」していないユーザーから隠して、完了したら解放します。

これは多くの点で問題が発生する可能性があります(Joeユーザーは行をロックし、今日は出ていて、Janeは今必要です)が、場合によっては適切な解決策になることがあります。

+0

+1が好ましい方法です:) –

関連する問題