Spring学习总结9(基于Hibernate的事务管理)

时间:2021-02-19 18:01:06

基于注解形式的事务管理

 

XML配置

 

代码示例

类名上也可以写事务注解,但是优先级低于方法上的事务注解

 

 

@Transactional 注解的属性

属性 类型 描述
propagation 枚举型:Propagation 可选的传播性设置 默认为required
isolation 枚举型:Isolation 可选的隔离性级别(默认值:ISOLATION_DEFAULT
readOnly 布尔型 读写型事务 只读型事务(当查询时设为只读会比不设要快)
timeout int型(以秒为单位) 事务超时
rollbackFor 一组 Class 类的实例,必须是Throwable 的子类 一组异常类,遇到时 必须 进行回滚。默认情况下checked exceptions不进行回滚,仅unchecked exceptions(即RuntimeException的子类)才进行事务回滚。
rollbackForClassname 一组 Class 类的名字,必须是Throwable的子类 一组异常类名,遇到时 必须 进行回滚
noRollbackFor 一组 Class 类的实例,必须是Throwable 的子类 一组异常类,遇到时 必须不 回滚。
noRollbackForClassname 一组 Class 类的名字,必须是Throwable 的子类 一组异常类,遇到时 必须不 回滚

 

事务传播特性详解:

1.required

Spring学习总结9(基于Hibernate的事务管理)

如果在执行该方法之前,已经打开了一个事务,会将当前方法加入到之前的事务之中。如果没有,则自己新开一个事务。

 

2.requiredsNew

 

Spring学习总结9(基于Hibernate的事务管理)

 

如果在执行该方法之前,已经打开了一个事务,会挂起之前的事务,自己新开一个事务。当自己的事务执行完之后,再进行之前的事务。

 

3.mandatory

在调用方法之前,必须已经打开了一个事务,否则将会抛出异常

 

4.nested

如果在执行方法前,已经打开了一个事务,则再开一个新事务内嵌在之前的事务之中。

nested与required的区别:nested注解的方法,如果事务回滚不会影响到之前的事务

nested与requiredsNew的区别:nested注解的方法,如果之前的事务,在nested已经执行完之后,事务进行了回滚,也会让nested里的事务进行回滚

 

5.never

如果在执行该方法之前,已经打开了一个事务,则抛出异常

 

6.not_supported

注解not_supported的方法不支持事务。如果在执行该方法之前,已经打开了一个事务,将之前的事务挂起,执行完该方法之后,在继续进行之前的事务

 

7.supported

如果在执行该方法之前,已经打开了一个事务,支持之前的事务,如果没有打开事务,则也不打开新的事务。即与调用supported注解的方法的事务保持一致,它有我就有,它无我就无

 

基于XML的事务管理(常用)

将上面XML中的<tx:annotation-driven transaction-manager="txManager"/>给去掉,增加如下的配置