1:在同一个类中,如果A方法有事务,B方法也有事务(propagation = Propagation.REQUIRES_NEW),如下代码所示:
@Override
@Transactional
public void insertUser(User user, Goods goods){
userMapper.insert(user);
try {
}catch (Exception e){
}
}
@Override
@Transactional(propagation = Propagation.REQUIRES_NEW)
public void insertGoods(Goods goods) throws Exception{
goodsMapper.insert(goods);
throw new Exception("sadf");
}
则B方法是会插入数据的,事务是没有回滚的。
2:Spring事务实现机制:Spring事务是使用AOP原理实现的,其实也就是动态代理,动态代理的作用是实现方法增强。
动态代理需要两个重要的类:Proxy和InvocationHandler
Proxy :负责new对象
InvocationHandler : 实现增强
3:注解:@Auword,也是实现代理模式
也是代理类spring容器启动的时候 所有的类全部扫描,发现加了注解之后,方法为key 注解为value,Map<key,List<Value>>
不同的注解对应的拦截器是不一样的
4:为了解决1问题,在springboot项目中,在Application类中添加注解 @EnableAspectJAutoProxy(exposeProxy=true)
然后在A方法中实现这样的方法:所以方法B能被动态代理了,方法前后则实现方法增强,从而实现事务。
@Override
@Transactional
public void insertUser(User user, Goods goods){
userMapper.insert(user);
try {
IUserService service = (IUserService)AopContext.currentProxy();
service.insertGoods(goods);
}catch (Exception e){
}
}
@Override
@Transactional(propagation = Propagation.REQUIRES_NEW)
public void insertGoods(Goods goods) throws Exception{
goodsMapper.insert(goods);
throw new Exception("sadf");
}