Hibernate悲观锁-乐观锁
2017-09-09 21:23
253 查看
首先说一下数据库事务隔离级别
READ UNCOMMITEED:允许事务读取其它事务未提交的变更READ COMMITED:(oracle 默认级别) 只允许事务读取已提交的变 更,避免读到其他事务没有提交的数据。
REPEATABLE_READ:(mysql默认级别)
在这个事务持续期间,禁止其他事务对这个字段进行修改,
避免不可重复读(一个事务读取数据之后操作期间,另一个事务对数据进行了修改,此时第一个事务读到的数据就出错了)
SERIALIZABLE: 这个事务持续期间,禁止其它事务对该表执行修改操作
hibernate 悲观锁-乐观锁
1>为什么要加锁:Hibernate不设置的话默认是与数据库的事务隔离机制一致的。
如果数据库设置的隔离级别是READ COMMITED,为了避免不可重复 读的问题,就需要Hibernate造作事务时加锁。
2>悲观锁原理:
本质是通过sql语句的for update子句锁定了表中符合的记录.
本次提交事务之前,其他事务无法使用该数据.(相当于REPEATABLE_READ事务隔离)
//使用悲观锁示例 Account a = (Account)session.load(Account.class, 1, LockMode.UPGRADE);
缺点:锁住数据不让别人访问,对于需要高并发的访问的数据是不适用的
3>乐观锁原理:(解决了悲观锁的缺点)
实质上乐观锁并没有给数据加锁,其它事务还是可以使用该数据的。
乐观锁只是给数据添加了一个version字段作为标记,每个事务在对数据操作之后,这个version值就会自增1。
事务操作结束后,在提交事务时候就会检查这个标记字段的值,如果这个值与事务最初拿到的值相同,则认为其他事务没有对数据操作,可以提交事务。
否则,就认为其他事务对数据进行了操作,事务最初读到的数据已经失效,此时就会抛出 org.hibernate.TransactionException异常,提交事务失败。
//为Persons持久化数据添加乐观锁示例
1>给Persons数据表添加version字段
2>配置持久化类的配置文件(添加乐观锁)
<hibernate-mapping> <!--class添加乐观锁optimistic-lock="version"--> <class name="models.Person" table="person" catalog="mydatabase" optimistic-lock="version"> <id name="pid" type="java.lang.Integer"> <column name="pid" /> <generator class="assigned" /> </id> <!--添加version--> <versionname="version" column="VERSION" type="java.lang.Integer"/> <property name="pname" type="java.lang.String"> <column name="pname" length="10" /> </property> <property name="page" type="java.lang.Integer"> <column name="page" /> </property> </class> </hibernate-mapping>
相关文章推荐
- Hibernate乐观锁和悲观锁
- Hibernate、乐观锁和悲观锁
- hibernate中的悲观锁和乐观锁的实现
- java面试狂魔之hibernate悲观锁和乐观锁
- Hibernate的乐观锁与悲观锁
- Hibernate 悲观锁和乐观锁
- Hibernate的乐观锁与悲观锁及应用
- 闲来无事,复习复习以前的东西---hibernate对悲观锁和乐观锁的支持
- Hibernate事务与并发问题处理(乐观锁与悲观锁)
- Hibernate中的乐观锁和悲观锁
- 细谈Hibernate之悲观锁和乐观锁解决hibernate并发
- hibernate中的悲观锁和乐观锁
- Hibernate悲观锁和乐观锁
- 系统学习hibernate之十二:hibernate中悲观锁和乐观锁
- Hibernate的乐观锁与悲观锁
- Hibernate乐观锁和悲观锁浅析
- Hibernate 悲观锁和乐观锁
- Hibernate中悲观锁和乐观锁
- Hibernate悲观锁与乐观锁
- 【Hibernate】——悲观锁和乐观锁