hibernate 锁:悲观锁、乐观锁
2013-11-03 17:14
337 查看
1. 锁:
Oracle:
悲观锁:
A事务:
publicvoid testlock1(){
Session session = HibernateUtil.getHibeSess();//获取会话
Transaction ts = session.beginTransaction();
Person p1 = (Person)session.get(Person.class,
"2c9282db421ca31501421ca3165d0001",LockMode.UPGRADE_NOWAIT);
//UPGRADE_NOWAIT:其他事务不能获取该资源,并且抛出LockAcquisitionException异常
//UPGRADE:其他事务等待当前事务释放资源
System.out.println(p1.getName());
p1.setName("张一");
session.saveOrUpdate(p1);//假设断点停到此代码处
ts.commit();
HibernateUtil.closeHibeSess(session);
}
B事务:
publicvoid testlock2(){
Session session = HibernateUtil.getHibeSess();//获取会话
Transaction ts = session.beginTransaction();
Person p1 = (Person)session.get(Person.class,
"2c9282db421ca31501421ca3165d0001",LockMode.UPGRADE_NOWAIT);//去拿资源时会抛出LockAcquisitionException异常
System.out.println(p1.getName());
p1.setName("张二");
session.saveOrUpdate(p1);
ts.commit();
HibernateUtil.closeHibeSess(session);
}
悲观锁:
A事务:
publicvoid testlock1(){
Session session = HibernateUtil.getHibeSess();//获取会话
Transaction ts = session.beginTransaction();
Person p1 = (Person)session.get(Person.class,
"2c9282db421ca31501421ca3165d0001",LockMode.UPGRADE);
//UPGRADE:其他事务等待当前事务释放资源
System.out.println(p1.getName());
p1.setName("张一");
session.saveOrUpdate(p1);//假设断点停到此代码处
ts.commit();
HibernateUtil.closeHibeSess(session);
}
B事务:
publicvoid testlock2(){
Session session = HibernateUtil.getHibeSess();//获取会话
Transaction ts = session.beginTransaction();
Person p1 = (Person)session.get(Person.class,
"2c9282db421ca31501421ca3165d0001",LockMode.UPGRADE);//去拿资源时,会一直等待A事务释放资源。
System.out.println(p1.getName());
p1.setName("张二");
session.saveOrUpdate(p1);
ts.commit();
HibernateUtil.closeHibeSess(session);
}
乐观锁:
Person.java
publicclass
Person implements Serializable{
private String
pno;
private String
name;
private String
address;
private DepartmentEntity
dept;
privateintage;
privateintbbkz;//版本控制
必须为int
且不能为空
}
Person.hbm.xml:
<hibernate-mapping
>
<class
name="com.etc.entity.singleface.Person"
table="t_happylock_person"
lazy="false"
optimistic-lock="version"><!--
指定此实体采用版本号进行锁 -->
<id
name="pno">
<generator
class="uuid"/>
</id>
<version
name="bbkz"></version><!--
指定版本号存放列 -->
<property
b04d
name="name"/>
<property
name="address"/>
<property
name="age"/>
<many-to-one
name="dept"column="deptid"
cascade="save-update"fetch="join"
></many-to-one>
</class>
</hibernate-mapping>
Oracle:
悲观锁:
A事务:
publicvoid testlock1(){
Session session = HibernateUtil.getHibeSess();//获取会话
Transaction ts = session.beginTransaction();
Person p1 = (Person)session.get(Person.class,
"2c9282db421ca31501421ca3165d0001",LockMode.UPGRADE_NOWAIT);
//UPGRADE_NOWAIT:其他事务不能获取该资源,并且抛出LockAcquisitionException异常
//UPGRADE:其他事务等待当前事务释放资源
System.out.println(p1.getName());
p1.setName("张一");
session.saveOrUpdate(p1);//假设断点停到此代码处
ts.commit();
HibernateUtil.closeHibeSess(session);
}
B事务:
publicvoid testlock2(){
Session session = HibernateUtil.getHibeSess();//获取会话
Transaction ts = session.beginTransaction();
Person p1 = (Person)session.get(Person.class,
"2c9282db421ca31501421ca3165d0001",LockMode.UPGRADE_NOWAIT);//去拿资源时会抛出LockAcquisitionException异常
System.out.println(p1.getName());
p1.setName("张二");
session.saveOrUpdate(p1);
ts.commit();
HibernateUtil.closeHibeSess(session);
}
悲观锁:
A事务:
publicvoid testlock1(){
Session session = HibernateUtil.getHibeSess();//获取会话
Transaction ts = session.beginTransaction();
Person p1 = (Person)session.get(Person.class,
"2c9282db421ca31501421ca3165d0001",LockMode.UPGRADE);
//UPGRADE:其他事务等待当前事务释放资源
System.out.println(p1.getName());
p1.setName("张一");
session.saveOrUpdate(p1);//假设断点停到此代码处
ts.commit();
HibernateUtil.closeHibeSess(session);
}
B事务:
publicvoid testlock2(){
Session session = HibernateUtil.getHibeSess();//获取会话
Transaction ts = session.beginTransaction();
Person p1 = (Person)session.get(Person.class,
"2c9282db421ca31501421ca3165d0001",LockMode.UPGRADE);//去拿资源时,会一直等待A事务释放资源。
System.out.println(p1.getName());
p1.setName("张二");
session.saveOrUpdate(p1);
ts.commit();
HibernateUtil.closeHibeSess(session);
}
乐观锁:
Person.java
publicclass
Person implements Serializable{
private String
pno;
private String
name;
private String
address;
private DepartmentEntity
dept;
privateintage;
privateintbbkz;//版本控制
必须为int
且不能为空
}
Person.hbm.xml:
<hibernate-mapping
>
<class
name="com.etc.entity.singleface.Person"
table="t_happylock_person"
lazy="false"
optimistic-lock="version"><!--
指定此实体采用版本号进行锁 -->
<id
name="pno">
<generator
class="uuid"/>
</id>
<version
name="bbkz"></version><!--
指定版本号存放列 -->
<property
b04d
name="name"/>
<property
name="address"/>
<property
name="age"/>
<many-to-one
name="dept"column="deptid"
cascade="save-update"fetch="join"
></many-to-one>
</class>
</hibernate-mapping>
相关文章推荐
- 寄存器 缓存 内存 之间的区别
- 基于数据存储管理的带有头尾指针的双向链表创建实例
- hibernate 一级缓存、二级缓存、查询缓存
- WAMP环境搭建
- 台式机+无线路由 配置 wifi热点
- SQLServer海量数据库的查询优化及分页算法方案
- j2se之数组的运用
- ubuntu下C语言的使用
- C#线程池用法
- hibernate 抓取策略fetch
- C#枚举类型
- 启动apache出现:/etc/init.d/apache2: 51: .: Can't open /etc/apache2/envvars错误
- 使用正则限制input框只能输入数字/英文/中文等等
- 命令行简介之文件处理工具
- 隆冬寒骨,风吹十一豪迈
- 如何在oracle中输出带单引号的字符串
- hibernate继承
- RAII封装TCP连接
- 开源软件?自由软件?免费软件?你了解多少?
- LeetCode Gas Station 两个特性,两种方法完美解答-更新证明方法