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");}
相關文章
相關標籤/搜索