@EnableTransactionManagement
提示: Spring Boot 以Spring 5.0为基础的版本无需注解自动开启事物
public void test() {
SystemMenu m1=new SystemMenu();
m1.setName("test2");
m1.setTerminal("00");
menuExtMapper.insertSelective(m1);
SystemMenu m2=new SystemMenu();
m2.setId(1);//重复ID 数据库会报错
m2.setName("test3");
m2.setTerminal("00");
}
@Transactional
public void test() {
SystemMenu m1=new SystemMenu();
m1.setName("test2");
m1.setTerminal("00");
menuExtMapper.insertSelective(m1);
SystemMenu m2=new SystemMenu();
m2.setId(1);//重复ID 数据库会报错
m2.setName("test3");
m2.setTerminal("00");
menuExtMapper.insertSelective(m2);
}
执行上方代码:证明上方的观点,下面以代码示例:提示:默认情况下,@Transactional注解只对RuntimeException及其子类异常有效。
@Transactional
public void test() throws Exception {
SystemMenu m1=new SystemMenu();
m1.setName("test2");
m1.setTerminal("00");
menuExtMapper.insertSelective(m1);
if (1==1){
throw new Exception("EEEEEE");
}
SystemMenu m2=new SystemMenu();
m2.setId(1);//重复ID 数据库会报错
m2.setName("test3");
m2.setTerminal("00");
menuExtMapper.insertSelective(m2);
}
上方代码,在处理数据中间主动抛出了Exception异常,执行代码观察控制台以及数据库:
提示:
可以通过注解@Transactional中的rollbackFor 来指定事物遇到那些异常会启用,同样也可以通过noRollbackFor指定那些异常不会滚
例如下方的配置事物遇到所有的Exception都会回滚
@Transactional(rollbackFor = {Exception.class})
@Transactional(rollbackFor = {Exception.class})
public void test() throws Exception {
SystemMenu m1=new SystemMenu();
m1.setName("test2");
m1.setTerminal("00");
menuExtMapper.insertSelective(m1);
oo();
}
public void oo(){
SystemMenu m2=new SystemMenu();
m2.setId(1);
m2.setName("test2");
m2.setTerminal("00");
menuExtMapper.insertSelective(m2);
}
执行代码,观察控制台和数据库:
通过上方实验,我们可以看到事物生效了。所以内部调用其他方法出现异常同样会触发事物
提示:
调用的方法需没有标注注解@Transactional,如果标注注解会有几种情况,后方说明。
@Transactional(rollbackFor = {Exception.class})
public void test() throws Exception {
oo();
SystemMenu m1=new SystemMenu();
m1.setId(1);
m1.setName("test2");
m1.setTerminal("00");
menuExtMapper.insertSelective(m1);
}
@Transactional
public void oo(){
SystemMenu m2=new SystemMenu();
m2.setName("test3");
m2.setTerminal("00");
menuExtMapper.insertSelective(m2);
}
执行测试代码并观察控制台和数据库:
事物传播的几个级别分别为:注意:
所以上方两个方法的事物会被整合成一个事物处理。@Transactional注解也可以通过propagation 来指定传播级别,如下:
- 调用的方法上指定的Exception范围必须包含被调用方抛出异常的范围,否则可能出现不一致
- 上方还涉及到一个知识点,事物的传播级别,默认情况下事物的传播级别为"REQUIRED",即:如果当前没有事务,就新建一个事务,如果已经存在一个事务中,加入到这个事务中。
@Transactional(propagation = Propagation.REQUIRED)
https://www.leftso.com/article/747.html