2

win-form.net 4.0 で開発され、SQL 2008asを使用するアプリケーションがありますDBMS

ユーザーはアイテムのリストからアイテムを開くことができ、開くたびにデータベースをuserIdで更新して、特定のアイテムが特定のユーザーによって開かれていることを示すため、他のユーザーが同じアイテムを同時に開くことはできません。また、ユーザーがアイテムを閉じると、他のユーザーが開くことができる通常の状態にリセットされます。

しかし、一部のシステムがクラッシュ/スタックした場合などにデータベースを更新する方法を知りたいです。この種の状況を処理するための良い解決策はありますか?

4

3 に答える 3

2

1 つの解決策は、データ テーブルにタイム スタンプ列を追加することです。ユーザーが (他の作業に加えて) 項目にアクセスするたびに、このタイム スタンプ値を設定します。

次に、レコードを繰り返し処理し、期限切れのロックを時々解放する別のタスク/サービスを作成できます。

于 2012-09-14T15:44:05.597 に答える
1

したがって、独自のロックメカニズムを実装しようとしています。あなたにアイデアを与えるはずのデッドロックの問題を軽減する方法をご覧ください。基本的に、通知またはスタンプを使用してロックの所有者ステータスを追跡し(ロックが無効であるか、リソースをまだ使用している場合)、リソースの枯渇を防ぎます。

要求された例

2人のユーザーがいます。ユーザーAとユーザーB。

ユーザーAがアプリ内でビューを開くと、次の2つのことが起こります。

  • DBを更新し、スタンプを現在の時刻に設定します。
  • ロックを維持する責任がある新しいバックグラウンドスレッドを開始します。このバックグラウンドスレッドはN-Deltaを待機する必要があります。ここで、Nはリソースを更新せずにロックできる最大分であり、deltaは更新時間のデルタです。したがって、たとえば、ユーザーの操作なしでビューを最大15分間ロックできるとすると、スレッドは15-1待機する必要があります(DBに「今回は注意が必要です」と通知するのにおそらく1分かかります)。

次に、ユーザーBがそのビューにアクセスしようとします。データベースでリソースとロックテーブルを確認し、15分から時間が経過していないビューにロックがある場合は、アクセスを拒否します。ただし、時間が15分を超える場合は、ユーザーBにアクセスを許可し、ユーザーAからアクセスを削除します。

ユーザーAまたはユーザーBのいずれかがビューを正常に閉じた場合は、DBから入口を削除するだけです。

これは非常に単純な例ですが、私が何を意味するのかがわかるはずです。

于 2012-09-14T15:45:17.983 に答える
0

私は以前に同様の状況に直面しました。このような場合、ユーザーがそのアイテムに対してアクションを実行するのにかかる最大時間(たとえば、15分)を想定する必要があります。item_id、lock_aquired_timeの2つの列を持つitem_lockというテーブルを作成します。ユーザーがアイテムをクリックするたびに、レコードがこのテーブルに挿入されます。他のユーザーがそのアイテムを開こうとすると、XYZによるアクションのためにリソースがロックされているという通知が画面にポップアップ表示されます。さらに、毎分実行され、15分より古いレコードを削除するサービスを作成する必要があります。
PS:ユーザーがアイテムに対してアクションを実行し終えると、その行はitem_lockテーブルから削除されます。

于 2012-09-14T15:52:40.907 に答える