|
马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
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”的名称正式发布了。 |
|