0

データベース内のテーブルAにt分ごとに行(複数の行)を挿入および更新するN個のプロセスがあります(N> t)。たとえば、午前12:00に開始します(N個のプロセスすべて)。最終更新のタイムスタンプを別のテーブルBに保存して、データが最後に更新されたのはいつかを確認します。

タイムスタンプをチェックしてデータが最新かどうかを確認するために読み取りロックを取得することを考えています。そうでない場合は、テーブルのロックを取得して、データベースを更新し、ロックを解除してください。

これはlinq-to-sqlを使用して実行できますか?プロセスがロックを取得し、何らかの理由でロックを解放しない可能性はありますか?その場合、ロックが自動的に解除されるまでのタイムアウト値はありますか?

どんなポインタも役に立ちます。ありがとう!

4

1 に答える 1

1

読み取りロックを取得してタイムスタンプを確認し、データが最新かどうかを確認します。そうでない場合は、テーブルのロックを取得してデータベースを更新し、ロックを解放します。

2 つのプロセスが同時に実行しようとすると、デッドロックが保証されます。

  • A はタイムスタンプで S ロックを取得します
  • B はタイムスタンプで S ロックを取得します
  • A データの X ロックを取得する
  • B は X のデータ ロックを取得しようとしますが、A によってブロックされます。
  • Aはデータを更新します
  • タイムスタンプを更新しようとすると、X ロックが必要になります。BのSロックでブロックされる

A は B によってブロックされ、B は A によってブロックされます => デッドロック。

ロックが自動的に解放されるまでのタイムアウト値はありますか

このような動作は完全な災害であり、プログラミング トランザクションが不可能になります。あなたが求めることができ、存在するのは、タイムアウトで取得できない場合にロックを放棄する要求SET LOCK_TIMEOUTです: .

解決策を提示したため、根本的な質問に答えるのは難しいですが、解決しようとしている実際の問題ではありません。データベースの一般的なコメントとして、条件付き更新は、適切な述語を追加することにより、セット指向の方法で行われます。UPDATE ... WHERE timestamp < @last_timestampエンジンにそれを正しく実装する方法を理解させます。

于 2012-08-09T11:51:45.560 に答える