//注解没有作用
@Transactional(propagation = Propagation.REQUIRES_NEW)
public void addBuyRecord(Map<String, Object> map) {
int addBuyRecord = sDao.addBuyRecord(map);
System.out.println(addBuyRecord);
}
@Transactional
@Override
public void updateGoodsNum(Map<String, Object> map) {
String goodsId = map.get("goodsId").toString();
String num = map.get("num").toString();
String[] goodId = goodsId.split(",");
String[] numArr = num.split(",");
for (int i=0;i<goodId.length;i++) {
Map<String,Object> m1 = new HashMap<>();
m1.put("num", numArr[i]);
m1.put("goodsId", goodId[i]);
//更新商品库存
int updateGoodsNum = sDao.updateGoodsNum(m1);
//调用增加记录方法
addBuyRecord(m1);
System.out.println("updateGoodsNum: "+updateGoodsNum);
if(updateGoodsNum==1) {
throw new ExceptionUtil("更新失败了!!!!");
}
}
}
问题:
像这种一个类中,两个方法的调用。执行updateGoodsNum方法时,addBuyRecord方法由于事务传播机制和updateGoodsNum在同一个事务中,所以更新商品库存失败导致回滚,记录功能也会失效。
解决:
1.把方法addBuyRecord抽离到另外一个XXService中去,并且在这个Service中注入XXService,使用XXService调用方法addBuyRecord
2.
<!-- AspectJ -->
<dependency>
<groupId>org.aspectj</groupId>
<artifactId>aspectjrt</artifactId>
<version>1.6.11</version>
</dependency>
<dependency>
<groupId>org.aspectj</groupId>
<artifactId>aspectjweaver</artifactId>
<version>1.6.11</version>
</dependency>
<!-- cglib -->
<dependency>
<groupId>cglib</groupId>
<artifactId>cglib</artifactId>
<version>2.1</version>
</dependency>
springboot启动类加上@EnableAspectJAutoProxy(exposeProxy = true)
如果是ssm框架配置xml文件
<aop:aspectj-autoproxy expose-proxy=“true”/ >