详解Hibernate中的事务

 

 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>




评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值