具体解释Hibernate中的事务

本文解析了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>




转载于:https://www.cnblogs.com/gavanwanggw/p/6888415.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值