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");}