apple0668
TDD,Agile,Scrum,Core Java,J2EE,Investment Blank
BlogJava
首頁
新隨筆
聚合
管理
隨筆-61 評論-159 文章-0 trackbacks-0
系統學習hibernate之十二:hibernate中悲觀鎖和樂觀鎖
hibernate中經常用到當多個人對同一數據同時進行修改的時候,會發生臟數據,造成數據的不一致性,解決辦法是可以通過悲觀鎖和樂觀鎖來實現。
悲觀鎖:在數據有加載的時候就給其進行加鎖,直到該鎖被釋放掉,其他用戶才可以進行修改,優點:數據的一致性保持得很好,缺點:不適合多個用戶并發訪問。當一個鎖住的資源不被釋放掉的時候,這個資源永遠不會被其他用戶進行修改,容易造成無限期的等待。
樂觀鎖:就是在對數據進行修改的時候,對數據才去版本或者時間戳等方式來比較,數據是否一致性來實現加鎖。優點比較好。
1、在悲觀鎖中,只要在加載的時候,才去session中的load方法,進行枷鎖,session.load(****.class,1,LockMode.UPDATE);
Hibernate將事務管理委托給底層的JDBC或者JTA,默認是基于JDBC Transaction的。
Hibernate支持“悲觀鎖(Pessimistic Locking)”和“樂觀鎖(Optimistic Locking)”。
悲觀鎖對數據被外界修改持保守態度,因此,在整個數據處理過程中,將數據處于鎖定狀態。悲觀鎖的實現,往往依靠數據庫提供的鎖機制。Hibernate通過使用數據庫的for update子句實現了悲觀鎖機制。Hibernate的加鎖模式有:
1. LockMode.NONE:無鎖機制
2. LockMode.WRITE:Hibernate在Insert和Update記錄的時候會自動獲取
3. LockMode.READ:Hibernate在讀取記錄的時候會自動獲取
4. LockMode.UPGRADE:利用數據庫的for update子句加鎖
5. LockMode.UPGRADE_NOWAIT:Oracle的特定實現,利用Oracle的for update nowait子句實現加鎖
2、
樂觀鎖大多是基于數據版本(Version)記錄機制實現。Hibernate在其數據訪問引擎中內置了樂觀鎖實現,可以通過class描述符的optimistic-lock屬性結合version描述符指定。optimistic-lock屬性有如下可選取值:
1. none:無樂觀鎖
2. version:通過版本機制實現樂觀鎖
3. dirty:通過檢查發生變動過的屬性實現樂觀鎖
4. all:通過檢查所有屬性實現樂觀鎖
例子:
1、悲觀鎖:
1>POJO類
public class PersimisticLocking {
private int id;
private String Item;
private int price;
//省略setter、getter方法
}
2>、POJO類的映射文件
1
<?
xml version="1.0"
?>
2
<!
DOCTYPE hibernate-mapping PUBLIC
3
"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
4
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd"
>
5
<
hibernate-mapping
package
="org.apple.hibernate"
>
6
<
class
name
="PersimisticLocking"
table
="t_persimisticLocking"
>
7
<
id
name
="id"
>
8
<
generator
class
="native"
/>
9
</
id
>
10
<
property
name
="item"
/>
11
<
property
name
="price"
/>
12
</
class
>
13
</
hibernate-mapping
>
3>、加載測試方法
1
public
void
testLoad1()
2
{
3
Session session
=
null
;
4
try
{
5
session
=
HibernateUtil.getSession();
6
session.beginTransaction();
7
OptimisticLocking o
=
(OptimisticLocking)session.load(OptimisticLocking.
class
,
1
);
8
System.out.println(
"
o.item=
"
+
o.getItem());
9
System.out.println(
"
o.price=
"
+
o.getPrice());
10
System.out.println(
"
o.version=
"
+
o.getVersion());
11
o.setPrice(o.getPrice()
-
10
);
12
session.update(o);
13
session.beginTransaction().commit();
14
}
catch
(Exception e)
{
15
//
TODO: handle exception
16
e.printStackTrace();
17
session.beginTransaction().rollback();
18
}
finally
{
19
HibernateUtil.closeSession(session);
20
}
21
22
}
PS:可以設置另外類似的方法,不枷鎖,先對上面的測試代碼設置斷點,點debug一部分,再運行不枷鎖的,可以看到,如果上面方法不釋放鎖的話,下面的數據就會造成無限期的等待。
2、樂觀鎖:
1>在悲觀鎖的基礎上加入private int version;和相關的setter、getter方法。
2>映射文件配置在class標簽里面加入
optimistic-lock="version"
,然后在的id標簽后面加入<version name=
"version"/>
3>測試方法:
1
public
void
testLoad1()
2
{
3
Session session
=
null
;
4
try
{
5
session
=
HibernateUtil.getSession();
6
session.beginTransaction();
7
OptimisticLocking o
=
(OptimisticLocking)session.load(OptimisticLocking.
class
,
1
);
8
System.out.println(
"
o.item=
"
+
o.getItem());
9
System.out.println(
"
o.price=
"
+
o.getPrice());
10
System.out.println(
"
o.version=
"
+
o.getVersion());
11
o.setPrice(o.getPrice()
-
10
);
12
session.update(o);
13
session.beginTransaction().commit();
14
}
catch
(Exception e)
{
15
//
TODO: handle exception
16
e.printStackTrace();
17
session.beginTransaction().rollback();
18
}
finally
{
19
HibernateUtil.closeSession(session);
20
}
21
22
}
PS:在初始數據的時候,version為0,在沒更新一次version都會在原來的基礎上加1,通過version的版本來實現樂觀鎖。
在上面的測試方法里面復制成另外一個方法,對上面的方法進行設置斷點,然后單步調試幾部,到NO.11行的時候暫停,此時對復制的另外方法運行,然后再運行完上面的方法,就會拋出異常,所以,在實際的項目開發中,可以通過對異常進行出來,這樣就會實現并發訪問。
-------------------------------------------------------------------------------------------------
PS:本博客文章,如果沒有注明是有“轉”字樣,屬于本人原創。如果需要轉載,務必
注明作者
和
文章的詳細出處地址
,否則不允許轉載,多謝合作!
posted on 2008-10-27 23:48
apple0668
閱讀(1448)
評論(0)
編輯
收藏
所屬分類:
hibernate
新用戶注冊
刷新評論列表
只有注冊用戶
登錄
后才能發表評論。
網站導航:
博客園
IT新聞
Chat2DB
C++博客
博問
管理
相關文章:
系統學習hibernate之十五:hibernate一級緩存
系統學習hibernate之十四:hibernate中HQL查詢語言(二)
系統學習hibernate之十三:hibernate中HQL查詢語言(一)
系統學習hibernate之十二:hibernate中悲觀鎖和樂觀鎖
系統學習hibernate之十一:set、list、map、array集合
系統學習hibernate之十:Component映射
系統學習hibernate之九:多對多關聯映射(雙向)
系統學習hibernate之八:多對多關聯映射(單向)
系統學習hibernate之七:一對多單向關聯
系統學習hibernate之六:一對一外鍵關聯映射雙向關聯
Email:
chensp1230@163.com
歡迎交流
框架是告訴人們不該去做什么,而不是告訴人們該去做什么;容器是告訴人們該去做什么,而不是告訴人們不該去做什么!
<
2008年10月
>
日
一
二
三
四
五
六
28
29
30
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
1
2
3
4
5
6
7
8
留言簿
(10)
給我留言
查看公開留言
查看私人留言
我參與的團隊
深圳Java俱樂部(0/0)
Netbeans 愛好者(0/0)
隨筆分類
(63)
Aglets(1)
drools(2)
eclipse(6)
groovy
hibernate(17)
java(7)
jboss
junit(3)
Log4(2)
MongoDB(1)
oracle(1)
spring(4)
struts2(8)
svn(1)
tomcat(4)
webwork(4)
web報表(1)
xml
心情港灣
集群(1)
隨筆檔案
(61)
2015年3月 (1)
2012年7月 (1)
2012年4月 (1)
2011年5月 (3)
2010年1月 (2)
2009年3月 (1)
2008年12月 (2)
2008年11月 (5)
2008年10月 (16)
2008年9月 (1)
2008年4月 (1)
2008年1月 (2)
2007年11月 (2)
2007年10月 (15)
2007年9月 (8)
友情鏈接
開源在線手冊
最新隨筆
1.?Ehcache集群方案
2.?MongoDB安裝手記
3.?任何人都可以重構<轉載>
4.?JDK6中JWS自帶webservice應用
5.?解決:Eclipse啟動tomcat 訪問不了 手動啟動可以訪問
6.?IntelliJ Idea10 常用快捷鍵
7.?Drools語法詳解<轉>
8.?eclipse3.4安裝drools插件手記
9.?Java日期時間運算
10.?java中使用功能強悍的正則表達式
搜索
最新評論
1.?re: Tomcat:IOException while loading persisted sessions: java.io.EOFException解決手記
非常感謝樓主分享,解決問題, Tomcat 7.0.59
--Gozs
2.?re: Tomcat:IOException while loading persisted sessions: java.io.EOFException解決手記[未登錄]
正解
--gao
3.?re: Tomcat:IOException while loading persisted sessions: java.io.EOFException解決手記
@123
已解決,謝謝提示myeclipse相關的有用信息~~
--sequoah
4.?re: Tomcat:IOException while loading persisted sessions: java.io.EOFException解決手記
贊 清空work文件夾就可以了
--維尼
5.?re: Tomcat:IOException while loading persisted sessions: java.io.EOFException解決手記
很好 問題解決了!
--兔兔
閱讀排行榜
1.?Tomcat:IOException while loading persisted sessions: java.io.EOFException解決手記(85542)
2.?系統學習hibernate之一:利用hibernate中的SchemaExport生成數據表(18641)
3.?eclipse的第一個struts2插件:Alveole Studio MVC Web Project An eclipse plugin for Struts 2(15692)
4.?Subversion之路---實現精細的目錄訪問權限控制<轉>(11309)
5.?IntelliJ Idea10 常用快捷鍵(9321)
評論排行榜
1.?Tomcat:IOException while loading persisted sessions: java.io.EOFException解決手記(62)
2.?eclipse的第一個struts2插件:Alveole Studio MVC Web Project An eclipse plugin for Struts 2(32)
3.?Tomcat啟動端口被占用異常處理(9)
4.?升級瑞星防火墻2008后,在myeclipse6.0中啟動tomcat遇到怪問題!(7)
5.?JDK6中JWS自帶webservice應用(6)
Powered by:
博客園
模板提供:
滬江博客
Copyright ©2025 apple0668
主站蜘蛛池模板:
亚洲国产av玩弄放荡人妇
|
色九月亚洲综合网
|
三年片在线观看免费大全
|
精品亚洲A∨无码一区二区三区
|
国内精品久久久久影院免费
|
国产99久久久国产精免费
|
国产高清免费观看
|
免费无码午夜福利片69
|
伊人久久综在合线亚洲91
|
GOGOGO免费观看国语
|
亚洲成av人在线视
|
5g影院5g天天爽永久免费影院
|
亚洲精品视频在线观看视频
|
91麻豆最新在线人成免费观看
|
激情亚洲一区国产精品
|
妞干网免费视频观看
|
青娱乐在线视频免费观看
|
亚洲一区二区三区影院
|
久久久久免费看黄a级试看
|
亚洲国产综合精品
|
国产精品视_精品国产免费
|
caoporn国产精品免费
|
99ri精品国产亚洲
|
在线免费观看一区二区三区
|
无遮挡a级毛片免费看
|
亚洲av永久无码精品网站
|
国产精品无码免费播放
|
国产福利免费视频
|
国产免费不卡v片在线观看
|
亚洲AV成人一区二区三区观看
|
亚洲一区日韩高清中文字幕亚洲
|
很黄很污的网站免费
|
亚洲精品天堂在线观看
|
亚洲精品A在线观看
|
97国产在线公开免费观看
|
亚洲国产成人AV网站
|
亚洲欧洲一区二区
|
国产成人精品免费视频大全五级
|
在线观看人成视频免费无遮挡
|
精品国产污污免费网站入口
|
亚洲国产成人资源在线软件
|