#spring声明式事务使用说明:
#前提:
1.springboot 2.0.3.RELEASE
2.application.properties中的配置(默认配置)如下:
spring.aop.auto=true
spring.aop.proxy-target-class=true #是否基于类代理
#说明:
1.如果 save1没有声明事务,那么在 save2/save3上声明的事务,对save1 和 save2/save3都不生效;
2.如果 save1上有声明事务,在 save2/save3上不管是否有事务声明,save1 和 save2/save3都在事务中执行,而且在同一个事务中;
3.跨类调用的方法事务,属于常规方式,这里不做说明;
#以下是示例代码
@Service
public class ClassA {
@Autowired
private ClassB classB;
public void testApi () {
String status = "2";
biz.save1(status);
}
}
public interface ClassB {
void save1(String status);
void save2(String status);
}
@Service
public class ClassBImpl implements ClassB {
@Autowired
private TableAMapper tableAMapper;
@Transactional
@Override
public void save1(String status) {
TalbeA info = new TableA();
info.setName("save1-" + status);
tableAMapper.insertSelective(info);
this.save2(status);
// 或者
this.save3(status);
}
@Transactional
@Override
public void save2(String status) {
TalbeA info = new TableA();
info.setName("save2-" + status);
tableAMapper.insertSelective(info);
if (status.equals("2")) {
throw new RuntimeException("save2.e");
}
info = new TableA();
info.setName("save2-" + status + status);
tableAMapper.insertSelective(info);
}
@Transactional
private void save3(String status) {
TalbeA info = new TableA();
info.setName("save3-" + status);
tableAMapper.insertSelective(info);
if (status.equals("2")) {
throw new RuntimeException("save3.e");
}
info = new TableA();
info.setName("save3-" + status + status);
tableAMapper.insertSelective(info);
}
}