Hibernate/悲観的ロックを実装する
をテンプレートにして作成
[
トップ
] [
新規
|
一覧
|
単語検索
|
最終更新
|
ヘルプ
|
ログイン
]
開始行:
// 下階層用テンプレート
#topicpath
----
//ここにコンテンツを記述します。
#contents
**悲観的ロックとは [#ldfb36dc]
SIZE(10){※私はデータベースの専門家でもないですし、Oracle...
Hibernate/楽観的ロックを実装する で楽観的ロックの実装につ...
ところでこのOracleのselect for updateですが、私は勘違いし...
トラン1がselect for update で占有ロックする
トラン2がselectしようとしたら、待ちor例外
だと思っていたんですが、違いました。正しくは
トラン1がselect for update で占有ロックする
トラン2がselect for update しようとしたら、待ちor例外
なんですね。つまりあるトランザクションが占有ロックをして...
**Hibernateでの悲観的ロックの実装方法 [#p211edd6]
Hibernateで悲観的ロックを取得するには、update前のselect時...
UserAttr user = (UserAttr) session.load(UserAttr.class, ...
とloadやget時に LockMode.UPGRADE という占有ロックするとい...
**やってみる [#w3050bcb]
テーブル構成などは Hibernate/Springを使ってトランザクショ...
-トランザクション1のスレッドがあるrowを
session.load(UserAttr.class, key,LockMode.UPGRADE);
という指定で検索
-トランザクション2のスレッドが同じrowを
session.load(UserAttr.class, key,LockMode.UPGRADE);
という指定で検索。ここでこのトランザクション2は待ち状態...
-トランザクション1のスレッドがそのrowを変更してコミット
-トランザクション2の待ち状態が解除され、このトランザクシ...
ということですね。
**ソース [#i3a249d5]
詳細は[[ソース>http://www.masatom.in/cgi-bin/viewvc.cgi/S...
new Thread(new Runnable() {
public void run() {
Session session = sessionFactory.openSession();
Transaction tx = session.beginTransaction();
System.out.println("トラ1開始");
// select for updateする
UserAttr user = (UserAttr) session.load(UserAttr.cla...
System.out.println("トラ1の取得結果" + user);
// このトランザクション内でカラムを変更し
user.setName("Thread1:" + System.currentTimeMillis());
waitt(3000);
// 上で3000msわざと待ちにしたこのスキにトランザクシ...
// この間にアクセスしたトランはロック解除待ちになる...
tx.commit();
session.close();
System.out.println("トラ1終了");
// 最後に表示する。
print();
System.out.println("トラ1終了");
}
}).start();
new Thread(new Runnable() {
public void run() {
waitt(1000);
Session session = sessionFactory.openSession();
Transaction tx = session.beginTransaction();
System.out.println("トラ2開始");
// 普通にselectしようとする。待ちにはいるはず
UserAttr user = (UserAttr) session.load(UserAttr.cla...
LockMode.UPGRADE);// ココもロックをつけないと、...
System.out.println("トラ2の取得結果" + user);
tx.commit();
session.close();
System.out.println("トラ2終了");
}
}).start();
**実行結果 [#y6fc7231]
実行結果は以下の通り
org.hibernate.impl.SessionFactoryImpl - building session...
ユーザ作成のトラン開始
org.hibernate.SQL - insert into MKINO.USER_ATTR (NAME, U...
ユーザ作成のトラン終了
Keyは abc40619
トラ1開始
[Thread-0] DEBUG org.hibernate.SQL - select userattr0_.U...
from MKINO.USER_ATTR userattr0_ where userattr0_.USERI...
トラ1の取得結果nu.mine.kino.entity.UserAttr@10e35d5[id=a...
トラ2開始
[Thread-1] DEBUG org.hibernate.SQL - select userattr0_.U...
from MKINO.USER_ATTR userattr0_ where userattr0_.USERI...
[Thread-0] DEBUG org.hibernate.SQL - update MKINO.USER_A...
トラ2の取得結果nu.mine.kino.entity.UserAttr@6a3960[id=ab...
トラ1終了
トラ2終了
このように
-selectはloadメソッドの指定により、select for updateにな...
-トランザクション1の途中(スレッドを待たせてるから)にトラ...
-そのためトラン2のselect for update はトラン1のupdateが...
となりました。確かにトランザクション2は待ち状態になった...
***待ちではなく、あきらめる [#c8046745]
待ち状態にするのではなく、すぐにあきらめるようにするには...
前:session.load(UserAttr.class, key,LockMode.UPGRADE);
後:session.load(UserAttr.class, key,LockMode.UPGRADE_NOW...
に変更します。実行すると
Exception in thread "Thread-1" org.hibernate.exception.L...
could not load an entity: [nu.mine.kino.entity.UserAttr#...
という例外がスローされました。
----
この記事は
#vote(おもしろかった[57],そうでもない[12])
- トラ1がSELECT〜FOR UPDATEしたとき、トラ2がFOR UPDATE...
- 若干追加。「トラ1がSELECT〜FOR UPDATEしたとき、トラ2...
- 半年以上たって亀レスですが、、、トラ2がfor Updateつけ...
#comment
#topicpath
SIZE(10){現在のアクセス:&counter;}
終了行:
// 下階層用テンプレート
#topicpath
----
//ここにコンテンツを記述します。
#contents
**悲観的ロックとは [#ldfb36dc]
SIZE(10){※私はデータベースの専門家でもないですし、Oracle...
Hibernate/楽観的ロックを実装する で楽観的ロックの実装につ...
ところでこのOracleのselect for updateですが、私は勘違いし...
トラン1がselect for update で占有ロックする
トラン2がselectしようとしたら、待ちor例外
だと思っていたんですが、違いました。正しくは
トラン1がselect for update で占有ロックする
トラン2がselect for update しようとしたら、待ちor例外
なんですね。つまりあるトランザクションが占有ロックをして...
**Hibernateでの悲観的ロックの実装方法 [#p211edd6]
Hibernateで悲観的ロックを取得するには、update前のselect時...
UserAttr user = (UserAttr) session.load(UserAttr.class, ...
とloadやget時に LockMode.UPGRADE という占有ロックするとい...
**やってみる [#w3050bcb]
テーブル構成などは Hibernate/Springを使ってトランザクショ...
-トランザクション1のスレッドがあるrowを
session.load(UserAttr.class, key,LockMode.UPGRADE);
という指定で検索
-トランザクション2のスレッドが同じrowを
session.load(UserAttr.class, key,LockMode.UPGRADE);
という指定で検索。ここでこのトランザクション2は待ち状態...
-トランザクション1のスレッドがそのrowを変更してコミット
-トランザクション2の待ち状態が解除され、このトランザクシ...
ということですね。
**ソース [#i3a249d5]
詳細は[[ソース>http://www.masatom.in/cgi-bin/viewvc.cgi/S...
new Thread(new Runnable() {
public void run() {
Session session = sessionFactory.openSession();
Transaction tx = session.beginTransaction();
System.out.println("トラ1開始");
// select for updateする
UserAttr user = (UserAttr) session.load(UserAttr.cla...
System.out.println("トラ1の取得結果" + user);
// このトランザクション内でカラムを変更し
user.setName("Thread1:" + System.currentTimeMillis());
waitt(3000);
// 上で3000msわざと待ちにしたこのスキにトランザクシ...
// この間にアクセスしたトランはロック解除待ちになる...
tx.commit();
session.close();
System.out.println("トラ1終了");
// 最後に表示する。
print();
System.out.println("トラ1終了");
}
}).start();
new Thread(new Runnable() {
public void run() {
waitt(1000);
Session session = sessionFactory.openSession();
Transaction tx = session.beginTransaction();
System.out.println("トラ2開始");
// 普通にselectしようとする。待ちにはいるはず
UserAttr user = (UserAttr) session.load(UserAttr.cla...
LockMode.UPGRADE);// ココもロックをつけないと、...
System.out.println("トラ2の取得結果" + user);
tx.commit();
session.close();
System.out.println("トラ2終了");
}
}).start();
**実行結果 [#y6fc7231]
実行結果は以下の通り
org.hibernate.impl.SessionFactoryImpl - building session...
ユーザ作成のトラン開始
org.hibernate.SQL - insert into MKINO.USER_ATTR (NAME, U...
ユーザ作成のトラン終了
Keyは abc40619
トラ1開始
[Thread-0] DEBUG org.hibernate.SQL - select userattr0_.U...
from MKINO.USER_ATTR userattr0_ where userattr0_.USERI...
トラ1の取得結果nu.mine.kino.entity.UserAttr@10e35d5[id=a...
トラ2開始
[Thread-1] DEBUG org.hibernate.SQL - select userattr0_.U...
from MKINO.USER_ATTR userattr0_ where userattr0_.USERI...
[Thread-0] DEBUG org.hibernate.SQL - update MKINO.USER_A...
トラ2の取得結果nu.mine.kino.entity.UserAttr@6a3960[id=ab...
トラ1終了
トラ2終了
このように
-selectはloadメソッドの指定により、select for updateにな...
-トランザクション1の途中(スレッドを待たせてるから)にトラ...
-そのためトラン2のselect for update はトラン1のupdateが...
となりました。確かにトランザクション2は待ち状態になった...
***待ちではなく、あきらめる [#c8046745]
待ち状態にするのではなく、すぐにあきらめるようにするには...
前:session.load(UserAttr.class, key,LockMode.UPGRADE);
後:session.load(UserAttr.class, key,LockMode.UPGRADE_NOW...
に変更します。実行すると
Exception in thread "Thread-1" org.hibernate.exception.L...
could not load an entity: [nu.mine.kino.entity.UserAttr#...
という例外がスローされました。
----
この記事は
#vote(おもしろかった[57],そうでもない[12])
- トラ1がSELECT〜FOR UPDATEしたとき、トラ2がFOR UPDATE...
- 若干追加。「トラ1がSELECT〜FOR UPDATEしたとき、トラ2...
- 半年以上たって亀レスですが、、、トラ2がfor Updateつけ...
#comment
#topicpath
SIZE(10){現在のアクセス:&counter;}
ページ名: