- 浏览: 3507468 次
- 性别:
- 来自: 杭州
文章分类
- 全部博客 (1491)
- Hibernate (28)
- spring (37)
- struts2 (19)
- jsp (12)
- servlet (2)
- mysql (24)
- tomcat (3)
- weblogic (1)
- ajax (36)
- jquery (47)
- html (43)
- JS (32)
- ibatis (0)
- DWR (3)
- EXTJS (43)
- Linux (15)
- Maven (3)
- python (8)
- 其他 (8)
- JAVASE (6)
- java javase string (0)
- JAVA 语法 (3)
- juddiv3 (15)
- Mule (1)
- jquery easyui (2)
- mule esb (1)
- java (644)
- log4j (4)
- weka (12)
- android (257)
- web services (4)
- PHP (1)
- 算法 (18)
- 数据结构 算法 (7)
- 数据挖掘 (4)
- 期刊 (6)
- 面试 (5)
- C++ (1)
- 论文 (10)
- 工作 (1)
- 数据结构 (6)
- JAVA配置 (1)
- JAVA垃圾回收 (2)
- SVM (13)
- web st (1)
- jvm (7)
- weka libsvm (1)
- weka屈伟 (1)
- job (2)
- 排序 算法 面试 (3)
- spss (2)
- 搜索引擎 (6)
- java 爬虫 (6)
- 分布式 (1)
- data ming (1)
- eclipse (6)
- 正则表达式 (1)
- 分词器 (2)
- 张孝祥 (1)
- solr (3)
- nutch (1)
- 爬虫 (4)
- lucene (3)
- 狗日的腾讯 (1)
- 我的收藏网址 (13)
- 网络 (1)
- java 数据结构 (22)
- ACM (7)
- jboss (0)
- 大纸 (10)
- maven2 (0)
- elipse (0)
- SVN使用 (2)
- office (1)
- .net (14)
- extjs4 (2)
- zhaopin (0)
- C (2)
- spring mvc (5)
- JPA (9)
- iphone (3)
- css (3)
- 前端框架 (2)
- jui (1)
- dwz (1)
- joomla (1)
- im (1)
- web (2)
- 1 (0)
- 移动UI (1)
- java (1)
- jsoup (1)
- 管理模板 (2)
- javajava (1)
- kali (7)
- 单片机 (1)
- 嵌入式 (1)
- mybatis (2)
- layui (7)
- asp (12)
- asp.net (1)
- sql (1)
- c# (4)
- andorid (1)
- 地价 (1)
- yihuo (1)
- oracle (1)
最新评论
-
endual:
https://blog.csdn.net/chenxbxh2 ...
IE6 bug -
ice86rain:
你好,ES跑起来了吗?我的在tomcat启动时卡在这里Hibe ...
ES架构技术介绍 -
TopLongMan:
...
java public ,protect,friendly,private的方法权限(转) -
贝塔ZQ:
java实现操作word中的表格内容,用插件实现的话,可以试试 ...
java 读取 doc poi读取word中的表格(转) -
ysj570440569:
Maven多模块spring + springMVC + JP ...
Spring+SpringMVC+JPA
快速掌握Hibernate中悲观锁和乐观锁
Hibernate悲观锁:在数据有加载的时候就给其进行加锁,直到该锁被释放掉,其他用户才可以进行修改;Hibernate乐观锁:在对数据进行修改的时候,对数据才去版本或者时间戳等方式来比较,数据是否一致性来实现加锁。
我们在使用Hibernate中经常用到当多个人对同一数据同时进行修改的时候,会发生脏数据,造成数据的不一致性,解决办法是可以通过悲观锁和乐观锁来实现。
Hibernate悲观锁:在数据有加载的时候就给其进行加锁,直到该锁被释放掉,其他用户才可以进行修改,优点:数据的一致性保持得很好,缺点:不适合多个用户并发访问。当一个锁住的资源不被释放掉的时候,这个资源永远不会被其他用户进行修改,容易造成无限期的等待。(加载数据)
Hibernate乐观锁:就是在对数据进行修改的时候,对数据才去版本或者时间戳等方式来比较,数据是否一致性来实现加锁。优点比较好。(更改或者插入数据)
一、在Hibernate悲观锁中,只要在加载的时候,才去session中的load方法,进行枷锁,session.load(****.class,1,LockMode.UPDATE);
Hibernate将事务管理委托给底层的JDBC或者JTA,默认是基于JDBC Transaction的。Hibernate支持“悲观锁(Pessimistic Locking)”和“乐观锁(Optimistic Locking)”。
Hibernate悲观锁对数据被外界修改持保守态度,因此,在整个数据处理过程中,将数据处于锁定状态。Hibernate悲观锁的实现,往往依靠数据库提供的锁机制。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子句实现加锁
二、乐观锁大多是基于数据版本(Version)记录机制实现。Hibernate在其数据访问引擎中内置了Hibernate乐观锁实现,可以通过class描述符的optimistic-lock属性结合version描述符指定。optimistic-lock属性有如下可选取值:
1. none:无乐观锁
2. version:通过版本机制实现乐观锁
3. dirty:通过检查发生变动过的属性实现乐观锁
4. all:通过检查所有属性实现乐观锁
例子:
1)Hibernate悲观锁:
1>POJO类
-
public class PersimisticLocking {
-
private int id;
-
-
private String Item;
-
-
private int price;
-
//省略setter、getter方法
-
}
2>、POJO类的映射文件
-
<?
xml
version
=
"1.0"
?>
-
<!DOCTYPE hibernate-mapping PUBLIC
-
"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
-
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd"
>
-
<
hibernate-mapping
package
=
"org.apple.hibernate"
>
-
<
class
name
=
"PersimisticLocking"
table
=
"t_persimisticLocking"
>
-
<
id
name
=
"id"
>
-
<
generator
class
=
"native"
/>
-
</
id
>
-
<
property
name
=
"item"
/>
-
<
property
name
=
"price"
/>
-
</
class
>
-
</
hibernate-mapping
>
3>、加载测试方法
-
public void testLoad1()
-
{
-
Session
session
=
null
;
-
try {
-
session
=
HibernateUtil
.getSession();
-
session.beginTransaction();
-
OptimisticLocking
o
= (OptimisticLocking)session.load(OptimisticLocking.class, 1);
-
System.out.println("
o.item
="+o.getItem());
-
System.out.println("
o.price
="+o.getPrice());
-
System.out.println("
o.version
="+o.getVersion());
-
o.setPrice(o.getPrice()-10);
-
session.update(o);
-
session.beginTransaction().commit();
-
} catch (Exception e) {
-
// TODO: handle exception
-
e.printStackTrace();
-
session.beginTransaction().rollback();
-
}finally{
-
HibernateUtil.closeSession(session);
-
}
-
-
}
可以设置另外类似的方法,不枷锁,先对上面的测试代码设置断点,点debug一部分,再运行不枷锁的,可以看到,如果上面方法不释放锁的话,下面的数据就会造成无限期的等待。
2、Hibernate乐观锁:
1>在悲观锁的基础上加入private int version;和相关的setter、getter方法。
2>映射文件配置在class标签里面加入optimistic-lock="version",然后在的id标签后面加入<version name="version"/>
3>测试方法:
-
public void testLoad1()
-
{
-
Session
session
=
null
;
-
try {
-
session
=
HibernateUtil
.getSession();
-
session.beginTransaction();
-
OptimisticLocking
o
= (OptimisticLocking)session.load(OptimisticLocking.class, 1);
-
System.out.println("
o.item
="+o.getItem());
-
System.out.println("
o.price
="+o.getPrice());
-
System.out.println("
o.version
="+o.getVersion());
-
o.setPrice(o.getPrice()-10);
-
session.update(o);
-
session.beginTransaction().commit();
-
} catch (Exception e) {
-
// TODO: handle exception
-
e.printStackTrace();
-
session.beginTransaction().rollback();
-
}finally{
-
HibernateUtil.closeSession(session);
-
}
-
-
}
在初始数据的时候,version为0,在没更新一次version都会在原来的基础上加1,通过version的版本来实现Hibernate乐观锁。
在上面的测试方法里面复制成另外一个方法,对上面的方法进行设置断点,然后单步调试几部,到NO.11行的时候暂停,此时对复制的另外方法运行,然后再运行完上面的方法,就会抛出异常,所以,在实际的项目开发中,可以通过对异常进行出来,这样就会实现并发访问。
快速掌握Hibernate中悲观锁和乐观锁
Hibernate悲观锁:在数据有加载的时候就给其进行加锁,直到该锁被释放掉,其他用户才可以进行修改;Hibernate乐观锁:在对数据进行修改的时候,对数据才去版本或者时间戳等方式来比较,数据是否一致性来实现加锁。
我们在使用Hibernate中经常用到当多个人对同一数据同时进行修改的时候,会发生脏数据,造成数据的不一致性,解决办法是可以通过悲观锁和乐观锁来实现。
Hibernate悲观锁:在数据有加载的时候就给其进行加锁,直到该锁被释放掉,其他用户才可以进行修改,优点:数据的一致性保持得很好,缺点:不适合多个用户并发访问。当一个锁住的资源不被释放掉的时候,这个资源永远不会被其他用户进行修改,容易造成无限期的等待。(加载数据)
Hibernate乐观锁:就是在对数据进行修改的时候,对数据才去版本或者时间戳等方式来比较,数据是否一致性来实现加锁。优点比较好。(更改或者插入数据)
一、在Hibernate悲观锁中,只要在加载的时候,才去session中的load方法,进行枷锁,session.load(****.class,1,LockMode.UPDATE);
Hibernate将事务管理委托给底层的JDBC或者JTA,默认是基于JDBC Transaction的。Hibernate支持“悲观锁(Pessimistic Locking)”和“乐观锁(Optimistic Locking)”。
Hibernate悲观锁对数据被外界修改持保守态度,因此,在整个数据处理过程中,将数据处于锁定状态。Hibernate悲观锁的实现,往往依靠数据库提供的锁机制。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子句实现加锁
二、乐观锁大多是基于数据版本(Version)记录机制实现。Hibernate在其数据访问引擎中内置了Hibernate乐观锁实现,可以通过class描述符的optimistic-lock属性结合version描述符指定。optimistic-lock属性有如下可选取值:
1. none:无乐观锁
2. version:通过版本机制实现乐观锁
3. dirty:通过检查发生变动过的属性实现乐观锁
4. all:通过检查所有属性实现乐观锁
例子:
1)Hibernate悲观锁:
1>POJO类
- public class PersimisticLocking {
- private int id;
- private String Item;
- private int price;
- //省略setter、getter方法
- }
2>、POJO类的映射文件
- <? xml version = "1.0" ?>
- <!DOCTYPE hibernate-mapping PUBLIC
- "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
- "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd" >
- < hibernate-mapping package = "org.apple.hibernate" >
- < class name = "PersimisticLocking" table = "t_persimisticLocking" >
- < id name = "id" >
- < generator class = "native" />
- </ id >
- < property name = "item" />
- < property name = "price" />
- </ class >
- </ hibernate-mapping >
3>、加载测试方法
- public void testLoad1()
- {
- Session session = null ;
- try {
- session = HibernateUtil .getSession();
- session.beginTransaction();
- OptimisticLocking o = (OptimisticLocking)session.load(OptimisticLocking.class, 1);
- System.out.println(" o.item ="+o.getItem());
- System.out.println(" o.price ="+o.getPrice());
- System.out.println(" o.version ="+o.getVersion());
- o.setPrice(o.getPrice()-10);
- session.update(o);
- session.beginTransaction().commit();
- } catch (Exception e) {
- // TODO: handle exception
- e.printStackTrace();
- session.beginTransaction().rollback();
- }finally{
- HibernateUtil.closeSession(session);
- }
- }
可以设置另外类似的方法,不枷锁,先对上面的测试代码设置断点,点debug一部分,再运行不枷锁的,可以看到,如果上面方法不释放锁的话,下面的数据就会造成无限期的等待。
2、Hibernate乐观锁:
1>在悲观锁的基础上加入private int version;和相关的setter、getter方法。
2>映射文件配置在class标签里面加入optimistic-lock="version",然后在的id标签后面加入<version name="version"/>
3>测试方法:
- public void testLoad1()
- {
- Session session = null ;
- try {
- session = HibernateUtil .getSession();
- session.beginTransaction();
- OptimisticLocking o = (OptimisticLocking)session.load(OptimisticLocking.class, 1);
- System.out.println(" o.item ="+o.getItem());
- System.out.println(" o.price ="+o.getPrice());
- System.out.println(" o.version ="+o.getVersion());
- o.setPrice(o.getPrice()-10);
- session.update(o);
- session.beginTransaction().commit();
- } catch (Exception e) {
- // TODO: handle exception
- e.printStackTrace();
- session.beginTransaction().rollback();
- }finally{
- HibernateUtil.closeSession(session);
- }
- }
在初始数据的时候,version为0,在没更新一次version都会在原来的基础上加1,通过version的版本来实现Hibernate乐观锁。
在上面的测试方法里面复制成另外一个方法,对上面的方法进行设置断点,然后单步调试几部,到NO.11行的时候暂停,此时对复制的另外方法运行,然后再运行完上面的方法,就会抛出异常,所以,在实际的项目开发中,可以通过对异常进行出来,这样就会实现并发访问。
发表评论
-
犯规犯规犯规
2015-09-18 16:45 1309http://bbs.hupu.com/4466597.htm ... -
Hibernate延迟加载机制
2012-10-19 21:22 1341Hibernate延迟加载 ... -
Hibernate 子类中不能用session 操作数据库
2012-08-28 14:46 1704Object obj = this.g ... -
hibernate3 下载网址
2012-08-28 12:53 1906我的天啊,居然找个hibernate下载的地址也找了半天 h ... -
师父告诉我诀窍
2012-08-23 16:53 1474<value>classpath*:com ... -
spring 整合 hibernate
2012-07-28 10:41 14671.闲话少说了,先看版本吧。 2.在看要导入的包吧: ... -
使用spring的hibernateTemplate的方法 (转)
2012-07-24 17:12 1504使用spr ... -
hibernate 增删改查
2012-07-24 00:07 1835mysql中库表News,字段如下 id | i ... -
hibernate的对象映射配置文件中属性的介绍和说明
2012-03-04 13:45 1670持久化对象之间一对一的关联关系是通过one-to-one 元 ... -
HIbernate主键生成策略详解 (转)
2012-03-04 13:39 1709HIberna ... -
hibernate 复习 单向一对一的实现
2012-03-03 15:38 1418hibernate中单向一对一实现有三种方式:主键关联, ... -
hibernate 复习--demo
2012-03-02 20:40 1523今天晚上,搞好了hibernate的demo了,明天开始就是搞 ... -
HibernateDaoSupport与JdbcDaoSupport
2011-12-30 07:38 16772011年11月07日 星期一 ... -
hibernage getcurrentsession
2011-12-28 18:56 1557org.hibernate.Hibe ... -
hibernate开发资料学习资料
2011-12-28 07:42 1508http://dev.21tx.com/java/struts ... -
hibernate one to many lazy 常见错误解决
2011-06-26 20:17 2577解释一个关于Hibernate l ... -
hibernate的增删改查
2011-06-25 22:03 1809package com.endual.test; impor ... -
frameset
2011-05-25 09:43 1053<a href=url target=_blank> ... -
Hibernate+Spring+Struts2+ExtJS开发CRUD功能
2011-05-17 08:56 4812http://blog.csdn.net/myloon/arc ... -
nginx就启动了
2011-05-13 21:09 1762今天下载了nginx 0.7.52,与以往不同的是,这次版本增 ...
相关推荐
Hibernate的乐观锁与悲观锁的文档,帮助学习Hibernate的乐观锁与悲观锁,让你们学得更轻松。
Hibernate乐观锁和悲观锁分析,针对在使用HIBERNATE时怎么配置乐观锁进行了详细的范例讲解
NULL 博文链接:https://12345678.iteye.com/blog/721836
很好的描述Hibernate的悲观锁和乐观锁,
Hibernate锁机制_悲观锁和乐观锁
主要介绍了Hibernate实现悲观锁和乐观锁的有关内容,涉及hibernate的隔离机制,以及实现悲观锁和乐观锁的代码实现,需要的朋友可以了解下。
其中通过 version 实现的乐观锁机制是 Hibernate 官方推荐的乐观锁实现,同时也是 Hibernate 中,目前唯一在数据对象脱离 Session 发生修改的情况下依然有效的锁机制。因此,一般情况下,我们都选择 version 方式...
hibernate的乐观锁和悲观锁,两种锁搞定一切
Hibernate高级特性,悲观锁与乐观锁的应用和区别,及两者之间的区别。
NULL 博文链接:https://cdxs2.iteye.com/blog/1938245
主要介绍了Hibernate悲观锁和乐观锁实例详解,分享了相关代码示例,小编觉得还是挺不错的,具有一定借鉴价值,需要的朋友可以参考下
NULL 博文链接:https://jordanyangwei.iteye.com/blog/313756
学习hibernate的必备知识,当你学习hibernate时,就会对锁的概念有一定的了解了.
求助编辑百科名片相对悲观锁而言,乐观锁机制采取了更加宽松的加锁机制。悲观锁大多数情况下依靠数据库的锁机制实现,以保证操作最大程度的独占性。但随之而来的就是数据库 性能的大量开销,特别是对长事务而言,...
NULL 博文链接:https://tgwall163.iteye.com/blog/1291892
乐观锁version 对于在Hibernate中的乐观锁和悲观锁的学习
该资源主要是分析:乐观锁解决事务并发.乐观锁校验测试, 基于hiber管理的悲观锁实现
HibernateTestHibernate乐观锁和悲观锁的学习和实践
hibernate利用锁的相关功能详解,分为乐观锁和悲观锁。希望各位喜欢。