记一次mybatils查询返回null的坑

我是SSM在做订单支付和退款时遇到的问题,代码是之前的别人写的,现在因为主表状态有问题(退款成功,主表状态未更新,显示未成功),所以让我查找问题。

这个方法的代码具体是要做退款,并将记录添加到明细表,然后根据查询明细表的数据(是否成功)来修改主表的状态。然而在执行的时候退款成功,记录也添加到了明细表,但是在执行到根据退款id和成功状态的方法来查询明细表的时候却返回null,因此,断点根本就进不去更改主表状态的代码那里,控制台也有打印出sql和参数。而我将sql复制到Navicat中却可以查询到数据。查找原因:

1.查看字段,没问题,都对应;

2.查看mybatils返回参数,resultType也没问题;

3.网上查看有清mybatils缓存的案例,尝试也还是没用;

4.检查代码逻辑,也没问题;

于是我就纳闷了。。。问了同事,他们也说不知道。搞了好久,都没解决。

有一次无意间,我注意到,在调用退款并添加记录到明细表这个方法的上面加了一个事务的注解,如下:

@Transactional(propagation = Propagation.REQUIRES_NEW, timeout =100)

猜测是不是这个原因呢?

查资料:

Spring中七种Propagation类的事务属性详解:

 REQUIRED:支持当前事务,如果当前没有事务,就新建一个事务。这是最常见的选择。 

 SUPPORTS:支持当前事务,如果当前没有事务,就以非事务方式执行。 

 MANDATORY:支持当前事务,如果当前没有事务,就抛出异常。 

 REQUIRES_NEW:新建事务,如果当前存在事务,把当前事务挂起。 

 NOT_SUPPORTED:以非事务方式执行操作,如果当前存在事务,就把当前事务挂起。 

 NEVER:以非事务方式执行,如果当前存在事务,则抛出异常。 

 NESTED:支持当前事务,如果当前事务存在,则执行一个嵌套事务,如果当前没有事务,就新建一个事务。

于是我把这个注解注释掉,再次运行,结果成功查询出数据,数据库主表的状态也显示正确了。

你可能感兴趣的:(记一次mybatils查询返回null的坑)