2009-05-12 34 views
1

私はDB内で同時に実行される2つのトランザクションTとUを持っています。失われた更新の問題の例をどのように提供しますか?同時実行制御の更新が失われましたか?

アカウントA、B、Cの3つがあり、それぞれ£100、£200、£300があると仮定できます。

+0

これは、プログラミングに関連しないものとしてタグ付けされました。それは私に関連してかなりプログラミングされているようです... – Zifre

+0

本当にそれはあまりにも一般化されている - 本当の質問ではない - いくつかの詳細を提供してください - ありがとう。 –

+0

これは一般的な解決策ではかなり特殊な問題ですが、質問は明らかに宿題や試験の質問ですが、 –

答えて

15

「失われた更新」問題は、読者がライターをブロックしないシステムでは、同時読み取りとデータ更新に関するものです。トランザクションが正確に同時である必要はありません。

  1. セッション#1は、アカウントAを読み込み、100
  2. セッション#2は、アカウントAを読み取って取得、100
  3. セッション#2の更新プログラムは、150(50)に、アカウントとコミットします。
  4. セッション#1は、アカウントAを120(+20)に更新し、コミットします。このシナリオでは

、セッション#1は、別のセッションがすでにアカウントを変更したことを知らないので、セッション#2による更新が上書きされます(「失われました」)。

これを解決するにはいくつかの方法があります。バージョン番号または前後の比較。

+0

バージョン番号によって、あなたは休止状態のオプティミスティックロックを使用することを意味します – Anand

+0

Hi Anand、はい、私が理解する限り、レコードバージョン番号の。しかし、それがHibernateがサポートする唯一の方法かどうかはわかりません。 –

1

(3)アカウント100 150にアカウントAを更新 - アカウントAは150ないので>更新失敗 - >アカウントAは現在150

(4)アカウント100は120にアカウントAを更新100

1

これは、同じデータベース項目にアクセスする2つのトランザクションが、一部のデータベース項目の値が正しくないようにインターリーブされた場合に発生します。

関連する問題