Spring事务笔记

1:在同一个类中,若是A方法有事务,B方法也有事务(propagation = Propagation.REQUIRES_NEW),以下代码所示:spring

@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>>springboot

不一样的注解对应的拦截器是不同的app

4:为了解决1问题,在springboot项目中,在Application类中添加注解 @EnableAspectJAutoProxy(exposeProxy=true)ide

而后在A方法中实现这样的方法:因此方法B能被动态代理了,方法先后则实现方法加强,从而实现事务。spa

@Override@Transactionalpublic 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");}
相关文章
相关标签/搜索