2012-04-05 14 views
2

2つのトランザクション(RR分離レベルの両方)が第2レベルのキャッシュされた同じアイテムを要求した場合、このアイテムを変更して保存します。今、そのアイテムを読むために、キャッシュされているのでSQLを実行しませんでした。この場合、彼らは実際にデータベーストランザクションを開始しますか?彼らが変更をコミットすると、アップデートの問題が失われますか?ビューの悲観的な観点からHibernate第2レベルキャッシュとRRトランザクションアイソレーション

答えて

1

セカンドレベルキャッシュがトランザクションに参加するように構成されている場合は、最初の書き込みロックを獲得した唯一のキャッシュされたオブジェクトを変更することができるだろうし、次に書きますデータベースへの変更。 2番目のトランザクションが書き込みロックを取得したいときは、最初のトランザクションが終了して解放されるまで待たなければなりません。

オプティミスティック・ロックでは、コンカレント変更例外(または類似の名前)が発生し、2番目のトランザクションが操作を再試行するはずです。

+0

キャッシュが読み書き可能であるとします。トランザクションでDBにアクセスすることは決してないので、トランザクションはDB内の共有読み取りロックを取得しません。最初にt1が更新され、オブジェクトをロックし、DB書き込みロックを取得し、DBを更新し、DB書き込みロックとオブジェクトロックを解放するとします。その後、t2はオブジェクトをロックし、DB書き込みロックを取得し、DBを更新し、DB書き込みロックおよびオブジェクトロックを解放する。だからt2はt1の変更を上書きしないでしょうか?分離レベルがRRであっても、失われた更新を取得しませんか? – shrini1000

+0

あなたが言及している例では、t1が最初に、次にt2が書き込まれます。失われた更新の問題は、t2がそれを変更する前に値を読み取った後にt2が書き込むときに発生します。あなたの例では、トランザクションは何も読み取らず、書き込みのみします。 t1がt1を更新する前にt2が値を読み取っていた場合、t2は読み取りロックを持っているため、t1は更新を実行できません。また、書き込みロックを読み取りロックと共有することはできません。 – Luciano

+0

両方ともキャッシュから読み込むので、同じ値が得られます。したがって、t1はt1がそれに書き込む前に値を読み取ります。その後、t1はそれに書き込み、次にt2はそれに書き込みます。彼らは共有読み込みロックを使用しなかったので(値はキャッシュでありDBではないため)、これはt1の更新を失わないでしょうか? – shrini1000

関連する問題