仓酷云
标题:
发布一篇Hibernate悲观锁的完成道理分析与利用悲观锁时的注重点
[打印本页]
作者:
蒙在股里
时间:
2015-1-18 11:07
标题:
发布一篇Hibernate悲观锁的完成道理分析与利用悲观锁时的注重点
java比较简单,没有C++的烦琐,但学习时最好有C++为基础.与JSP和SQL起应用,功能强大.
Hibernate撑持悲观锁。当多个事件同时对数据库表中的统一条数据操纵时,假如没有加锁机制的话,就会发生脏数据(dutydata)。Hibernate有2种机制能够办理这个成绩:悲观锁和失望锁。这里我们只会商悲观锁。
Hibernate悲观锁,能主动检测多个事件对统一条数据举行的操纵,并依据先胜准绳,提交第一个事件,其他的事件提交时则抛出org.hibernate.StaleObjectStateException非常。
Hibernate悲观锁是怎样做到的呢?
我们先从Hibernate悲观锁的完成提及。要完成Hibenate悲观锁,我们起首要在数据库内外增添一个版本把持字段,字段名随便,好比就叫version,对应hibernate范例只能为long,integer,short,timestamp,calendar,也就是只能为数字或timestamp范例。然后在hibernatemapping里作以下相似界说:
<versionname="version"
column="VERSION"
type="integer"
/>
告知Hibernateversion作为版本把持用,交由它办理。
固然在entityclass里也必要给version加上界说,界说的办法跟其他字段完整一样。
privateIntegerversion;
…
//setVersion()&&getVersion(Integer)
Hibernate悲观锁的的利用:
Sessionsession1=sessionFactory.openSession();
Sessionsession2=sessionFactory.openSession();
MyEntityet1=session1.load(MyEntity.class,id);
MyEntityet2=session2.load(MyEntity.class,id);
//这里et1,et2为统一条数据
Transactiontx1=session1.beginTransaction();
//事件1入手下手
et1.setName(“Entity1”);
//事件1中对该数据修正
tx1.commit();
session1.close();
//事件1提交
Transactiontx2=session2.beginTransaction();
//事件2入手下手
et2.setName(“Entity2”);
//事件2中对该数据修正
tx2.commit();
session2.close();
//事件2提交
在事件2提交时,由于它提交的数据比事件1提交后的数据旧,以是hibernate会抛出一个org.hibernate.StaleObjectStateException非常。
回到后面的成绩,Hibernate怎样晓得事件2提交的数据比事件1提交后的数据旧呢?
由于MyEntity有个version版本把持字段。
转头看看下面的源代码中的:
MyEntityet1=session1.load(MyEntity.class,id);
MyEntityet2=session2.load(MyEntity.class,id);
这里,et1.version==et2.version,好比此时version=1,
当事件1提交后,该数据的版本把持字段version=version+1=2,而事件2提交时version=1<2以是Hibernate以为事件2提交的数据为过期数据,抛出非常。
这就是Hibernate悲观锁的道理机制。
我们已晓得了Hibernate悲观锁是依据version的值来判别数据是不是过期,也就是说,在向数据库update某数据时,必需包管该entity里的version字段被准确地设置为update之前的值,不然hibernate悲观锁机制将没法依据version作出准确的判别。
在我们的WEB使用中,特别应当注重这个成绩。
在1995年5月23日以“Java”的名称正式发布了。
作者:
只想知道
时间:
2015-1-20 14:52
关于设计模式的资料,还是向大家推荐banq的网站 [url]http://www.ckuyun.com/[/url],他把GOF的23种模式以通俗易懂的方式诠释出来,纯Java描述,真是经典中的经典。
作者:
愤怒的大鸟
时间:
2015-1-29 11:05
另外编写和运行Java程序需要JDK(包括JRE),在sun的官方网站上有下载,thinking in java第三版用的JDK版本是1.4,现在流行的版本1.5(sun称作J2SE 5.0,汗),不过听说Bruce的TIJ第四版国外已经出来了,是专门为J2SE 5.0而写的。
作者:
老尸
时间:
2015-2-6 00:27
Java是一种计算机编程语言,拥有跨平台、面向对java
作者:
飘灵儿
时间:
2015-2-14 15:53
是一种为 Internet发展的计算机语言
作者:
活着的死人
时间:
2015-3-4 07:44
如果要向java web方向发展也要吧看看《Java web从入门到精通》学完再到《Struts2.0入门到精通》这样你差不多就把代码给学完了。有兴趣可以看一些设计模块和框架的包等等。
作者:
山那边是海
时间:
2015-3-11 17:58
是一种为 Internet发展的计算机语言
作者:
乐观
时间:
2015-3-19 05:30
任职于太阳微系统的詹姆斯·高斯林等人于1990年代初开发Java语言的雏形,最初被命名为Oak,目标设置在家用电器等小型系统的程序语言
欢迎光临 仓酷云 (http://ckuyun.com/)
Powered by Discuz! X3.2