仓酷云

 找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
查看: 781|回复: 7
打印 上一主题 下一主题

[学习教程] 发布一篇Hibernate悲观锁的完成道理分析与利用悲观锁时的注重点

[复制链接]
蒙在股里 该用户已被删除
跳转到指定楼层
楼主
发表于 2015-1-18 11:07:50 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有帐号?立即注册

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”的名称正式发布了。
只想知道 该用户已被删除
沙发
发表于 2015-1-20 14:52:44 | 只看该作者
关于设计模式的资料,还是向大家推荐banq的网站 [url]http://www.ckuyun.com/[/url],他把GOF的23种模式以通俗易懂的方式诠释出来,纯Java描述,真是经典中的经典。
愤怒的大鸟 该用户已被删除
板凳
发表于 2015-1-29 11:05:16 来自手机 | 只看该作者
另外编写和运行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:46 | 只看该作者
Java是一种计算机编程语言,拥有跨平台、面向对java
飘灵儿 该用户已被删除
5#
发表于 2015-2-14 15:53:24 | 只看该作者
是一种为 Internet发展的计算机语言
活着的死人 该用户已被删除
6#
发表于 2015-3-4 07:44:04 | 只看该作者
如果要向java web方向发展也要吧看看《Java web从入门到精通》学完再到《Struts2.0入门到精通》这样你差不多就把代码给学完了。有兴趣可以看一些设计模块和框架的包等等。
山那边是海 该用户已被删除
7#
发表于 2015-3-11 17:58:38 | 只看该作者
是一种为 Internet发展的计算机语言
乐观 该用户已被删除
8#
发表于 2015-3-19 05:30:07 | 只看该作者
任职于太阳微系统的詹姆斯·高斯林等人于1990年代初开发Java语言的雏形,最初被命名为Oak,目标设置在家用电器等小型系统的程序语言
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|Archiver|手机版|仓酷云 鄂ICP备14007578号-2

GMT+8, 2024-12-24 00:58

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表