详解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>

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-11-01 11:53:18

详解Hibernate中的事务的相关文章

详解Hibernate中的一级缓存

1.前言 在Hibernate中有三级缓存,本篇博客先详细的介绍一下,Hibernate中的一级缓存,也就是Session级别的缓存. 2.持久化对象 如果要说到Hibernate的缓存的话,那么首先咱得提一下hibernate中的持久化对象. 其中持久化对象有三种状态,分别是: transient(瞬时态):尚未与Session关联对象,失去引用的话,就会被JVM回收.一般就是直接New创建的对象. persistent(持久态):已经与当前session产生关联,并且相关联的session没

详解Hibernate中的二级缓存

1.前言 这篇博客再前几篇博客的基础上来讲解一下,Hibernate中的二级缓存,二级缓存是属于SessionFactory级别的缓存机制.第一级别的缓存是Session级别的缓存,是属于事务范围的缓存,由Hibernate管理,一般无需进行干预.第二级别的缓存是SessionFactory级别的缓存,是属于进程范围的缓存. 2.Hibernate二级缓存 1.分类 二级缓存也分为了两种 内置缓存:Hibernate自带的,不可卸载,通常在Hibernate的初始化阶段,Hibernate会把映

详解Hibernate中cascade与inverse

学习hibernate的时候对级联关系的概念老是分不清楚,尤其是cascade.inverse傻傻分不清.下面通过例子来简单说明. 准备工作: 首先创建数据库,新建两张表: 教室表classes (字段此处省) 学生表student(字段此处省) 教室与学生是一对多的关系. 然后新建项目,添加hibernate对两张表的支持. 1.cascade cascade表示级联操作,即两个实体间存在级联关系(一个类是另一个类中的属性)时,当保存.更新或删除一个实体时,是否对关联的实体做出相应操作(数据库

详解Hibernate中的NoSession问题

1.前言 今天在整合SSH框架的时候,当在表现层调用bean层查找数据的时候,报错,具体如下所示 根据字面上的意思,应该是代理不能被初始化,session已经关闭,这篇博客就来解决一下这个问题. 2.NoSession问题 1.原因分析 当执行Session的load()方法时,Hibernate不会立即执行查询CUSTOMERS表的select语句,仅仅返回Customer类的代理类的实例,这个代理类具由以下特征: (1)由Hibernate在运行时动态生成,它扩展了Customer类,因此它

【Hibernate】详解Hibernate中的inverse=”true”

首先两个类,一个是班级类,一个是学生类: public class Grade{ private int id; private String name; private Set students = new HashSet(); } public class Student { private int id; private String studentName; } 数据库中表的结构: t_grade: 两个字段:id  name t_student: 三个字段:id  studentNam

实例详解 EJB 中的六大事务传播属性--转

前言 事务 (Transaction) 是访问并可能更新数据库中各种数据项的一个程序执行单元 (unit).在关系数据库中,一个事务可以是一条或一组 SQL 语句,甚至整个程序.它有通常被称为 ACID 的原子性(Atomicity).一致性(Consistency).隔离性(Isolation).持续性(Durability)四大特性: 原子性(Atomicity):一个事务是一个不可分割的工作单位,事务中包括的诸操作要么都做,要么都不做. 一致性(Consistency):事务必须是使数据库

用IDEA详解Spring中的IoC和DI(挺透彻的,点进来看看吧)

用IDEA详解Spring中的IoC和DI 一.Spring IoC的基本概念 控制反转(IoC)是一个比较抽象的概念,它主要用来消减计算机程序的耦合问题,是Spring框架的核心.依赖注入(DI)是IoC的另外一种说法,只是从不同的角度描述相同的概念.看完这两句,是不是不但没懂,反而更迷惑了,别急,往下看: IoC的背景 我们都知道,在采用面向对象方法设计的软件系统中,它的底层实现都是由N个对象组成的,所有的对象通过彼此的合作,最终实现系统的业务逻辑. 如果我们打开机械式手表的后盖,就会看到与

详解Android中那些酷炫返回方式的实现

Android手机都会有返回键,不管是实体键,还是虚拟键.Android用户主要也都是通过这个返回键操控页面返回方式的,不比IOS逼格甚高的只保留一个操作键.这种方式是最普遍的返回方式,还有一种也是比较常见的,那就是页面内部自己响应.绝大多数APP每个页面的设计图顶部左侧都会有一个返回键图标,偶尔也有奇葩的设计放在底部左侧,点击这个图标即finish掉当前页面.简单的介绍完了最常见的两种方式,下面为大家介绍两种更友好的交互方式. 拿大家比较常用的三款社交软件的交互来说.腾讯微博的返回方式除去上述

CSS学习笔记(9)--详解CSS中:nth-child的用法

详解CSS中:nth-child的用法 前端的哥们想必都接触过css中一个神奇的玩意,可以轻松选取你想要的标签并给与修改添加样式,是不是很给力,它就是":nth-child". 下面我将用几个典型的实例来给大家讲解:nth-child的实际用途: Tips:还用低版本的IE浏览器的哥们请绕过! :nth-child(2)选取第几个标签,"2可以是你想要的数字" .demo01 li:nth-child(2){background:#090} :nth-child(n