1、 简述
Spring开发中一个事务方法声明是用@Transactional注解,该注解属性其中最重要的是propagation,表示打算该方法以什么样的方式使用事务,是用还是不用,是用当前的还是另起新建一个事务。其中propagation有七种配置,分别是REQUIRED、SUPPORTS、MANDATORY、REQUIRES_NEW、NOT_SUPPORTED、NEVER、NESTED。如果不额外声明,则默认是REQUIRED。
2. Spring中七种Propagation类的事务属性详解:
REQUIRED:支持当前事务,如果当前不在一个事务中,就新建一个事务。这是最常见的选择。 不声明默认是REQUIRED
SUPPORTS:支持当前事务,如果当前不在一个事务中,就以非事务方式执行。
MANDATORY:支持当前事务,如果当前不在一个事务中,就抛出异常。
REQUIRES_NEW:新建一个事务,如果已经在一个事务中,则把当前事务挂起执行自己这个事务。
NOT_SUPPORTED:以非事务方式执行操作,如果已经在一个事务中,就把当前事务挂起再执行自己。
NEVER:以非事务方式执行,如果当前存在事务,则抛出异常。
NESTED:支持当前事务,如果当前事务存在,则执行一个嵌套事务,如果当前没有事务,就新建一个事务。
3、 REQUIRED
含义:(1)当前改方法如果已经在一个事务中,就加入事务一起执行
(2) 输入当前方法不在一个事务中,就新建一个事务执行,
简言之,有就用,没有就新建,一定有事务
@Transactional(propagation = org.springframework.transaction.annotation.Propagation.REQUIRED, rollbackFor = Exception.class)
public void execute(DispatcherVO dispatcherVO) {...}
4、REQUIRES_NEW
含义:始终会新建一故意个事务,如果当前存在事务,则把当前事务挂起,创建并开始执行自己这个事务
示例代码如下:
@Transactional(propagation = org.springframework.transaction.annotation.Propagation.REQUIRES_NEW)
public List findUsersTrans(UserVO user, String condition)
@Transactional(propagation = Propagation.REQUIRES_NEW)
public String createShardingTable() {....}
5 事务的选择
DDL和DML和事务结合时,需要注意:
(1) 通常一个DDL的方法开始执行时,在一个事务中,则会影响当前这个事务的提交。应为DDL要求执行前将事务提交。如果DDL方法执行失败了,则会造成DDL之前的那部分事务提交了,会达到非预期的效果。
所以一般情况下,DDL方法使用REQUIRES_NEW的方式更合理一些,单开的这个事务不会影响原来的事务的提交。