详解事务的传播
@Transactional(propagation = Propagation.SUPPORTS)
事务种类(Propagation)
public enum Propagation
{
REQUIRED(TransactionDefinition
.PROPAGATION_REQUIRED
),
SUPPORTS(TransactionDefinition
.PROPAGATION_SUPPORTS
),
MANDATORY(TransactionDefinition
.PROPAGATION_MANDATORY
),
REQUIRES_NEW(TransactionDefinition
.PROPAGATION_REQUIRES_NEW
),
NOT_SUPPORTED(TransactionDefinition
.PROPAGATION_NOT_SUPPORTED
),
NEVER(TransactionDefinition
.PROPAGATION_NEVER
),
NESTED(TransactionDefinition
.PROPAGATION_NESTED
);
private final int value
;
Propagation(int value
) {
this.value
= value
;
}
public int value() {
return this.value
;
}
}
api 引入test
<dependency>
<groupId>org.springframework.boot
</groupId>
<artifactId>spring-boot-starter-test
</artifactId>
<scope>test
</scope>
</dependency>
package com
.test
;
import com
.imooc
.Application
;
import com
.imooc
.service
.StuService
;
import com
.imooc
.service
.TestTransService
;
import org
.junit
.Test
;
import org
.junit
.runner
.RunWith
;
import org
.springframework
.beans
.factory
.annotation
.Autowired
;
import org
.springframework
.boot
.test
.context
.SpringBootTest
;
import org
.springframework
.test
.context
.junit4
.SpringRunner
;
public class TransTest {
@Autowired
private StuService stuService
;
@Autowired
private TestTransService testTransService
;
public void myTest() {
testTransService
.testPropagationTrans();
}
}
事务传播
@Transactional(propagation = Propagation.REQUIRED)
1.父方法有事务,子方法无,此时子方法出现异常,子父都会回滚
2.父方法无事务,子方法有事务,父方法无异常不会回滚,子方法出现异常会回滚
@Transactional(propagation = Propagation.SUPPORTS)
如果当前有事务,则使用事务;如果当前没有事务,则不使用事务,可用于查询
1.父方法无事务,子方法有事务,子方法异常之前不会回滚
@Transactional(propagation = Propagation.MANDATORY)
当前必须有事务,无事务则报错
@Transactional(propagation = Propagation.REQUIRES_NEW)
如果当前有事务,会开启一个事务,分别去提交
1.父方法无事务,子方法有事务,父子是两个事务,子方法会回滚
2.父方法有事务(required),子方法有事务,异常在字方法里面,父子均会回滚;异常如果只在父方法里面,只有父方法会回滚
@Transactional(propagation = Propagation.NOT_SUPPORTED)
此方法不使用事务
父方法存在事务(required)的话,子方法使用该事务级别,子方法出现异常不会回滚,父方法会回滚
@Transactional(propagation = Propagation.NEVER)
存在事务,报异常
@Transactional(propagation = Propagation.NESTED)
父子事务一起去提交
必须当前存在一个事务,才会开启一个子事务
父方法出现异常,子方法无异常,也就是父事务出现异常,父子事务均会回滚
添加try catch后,父事务和其他事物不受影响
@EnableTransactionManagement
可以直接使用@Transactional,启动类里面无需加上@EnableTransactionManagement注解
已经在spring.factories里面自动装配
spring.factories