1.前言
上一篇博客讲解了Hibernate中的一级缓存,属于Session级别的,这篇博客讲解一下Hibernate中的事务机制。有关事务的概念,请参照通俗易懂数据库中的事务。
2.如何处理Hibernate中的事务
我们知道数据库中的事务,会造成一些影响。比如脏读、不可重复读、幻读。那么如何解决这些问题呢?
1.隔离级别设置
通过设置数据库的隔离级别可以消除一些影响。请参照博客通俗易懂数据库中的事务。
在hibernate中也有四种隔离级别,分别是
1—Read uncommitted isolation
2—Read committed isolation
4—Repeatable read isolation
8—Serializable isolation
如果要设置hibernate的事务隔离级别的话,直接添加如下语句即可
<span style="font-family:SimSun;font-size:18px;"><!-- 设置事务隔离级别 --> <property name="hibernate.connection.isolation">4</property></span>2.丢失更新如何解决
悲观锁
采用数据库内部锁的机制,在一个事务操作数据时,为数据加锁,另一个事务无法访问。如下所示:
<span style="font-family:SimSun;font-size:18px;">Customer customer = (Customer) session.load(Customer.class, 1,LockMode.UPGRADE); </span>采用上述后,在查询数据时 添加排它锁,默认生成的SQL语句如下
select * from customers for update;
解释:采用排他锁的话,一旦锁住,别人就无法访问。
乐观锁
乐观锁与数据库无关,在数据表中为数据添加版本字段,每次数据修改都会导致版本号+1
分析,正如上图所示,每个事务之前都会先去拿一下版本字段,当修改完成提交时,会再去核对一下目前拿到的版本字段与数据库是否一致,如果不一致的话就会报错。
用的时候只需在定义中加入版本字段即可
<span style="font-family:SimSun;font-size:18px;"><!-- 定义版本字段 --> <!-- name是属性名 --> <version name="version"></version> </span>
版权声明:本文为博主原创文章,未经博主允许不得转载。
时间: 2024-11-01 11:53:18