详解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://blog.csdn.net/jiangjunshow

猜你喜欢

转载自blog.csdn.net/qq_43747119/article/details/87730587
今日推荐