基于注解形式的事务管理
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
如果在执行该方法之前,已经打开了一个事务,会将当前方法加入到之前的事务之中。如果没有,则自己新开一个事务。
2.requiredsNew
如果在执行该方法之前,已经打开了一个事务,会挂起之前的事务,自己新开一个事务。当自己的事务执行完之后,再进行之前的事务。
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"/>给去掉,增加如下的配置