@Async和@Transactional导致查不到(事务还没结束,还在锁表,还没真的插入,或者说查询select查不到这个被事务包裹的隔离了(insert)的这条数据)【类似于线程隔离?】


1.@Async在务@Transactional时有毒(因为它俩原理都是[代理]?)——异步方法状态是影响主流程的(比如抛异常能抛到主流程我擦)。换其他方式异步(手动)
(待验证,估计也无效,并且从没在事务下试过,因为若出现这种场景,这是业务逻辑上已经混乱了)
  @Autowired
    private ExecutorService executor;  

    executor.execute(
                        () -> { // 多线程
                            ehrWxMsgCenter.sendCheckworkWeekStatiticsWx(receiverStaff, startDay, endDay);
                        });

【待验证:看别人代码写法,其实,在同一个事务中,又插又查这一条,是查的到的。。?Me2021年8月20日01:01:21所以不是@Transactional而是@Async/奇怪的异步/非主流异步(一个自身异常了会影响/回调?主流程抛异常的异步)有毒】


2.事务的方法拆出来,不加在一个上面(不行,这个方法还不是肯定公用
)


3.手动传参进去

========================

4.可能不是事务的原因,纯粹是你代码业务逻辑:查询数据库却在这条insert上面(之前)了-_-||。。。【这就要具体业务代码具体分析了。比如这次流程重构的发消息中我要查第一条process,只在发起时会存在这条数据它此时还没有的情况,那其他流程不变,发起流程重写下发消息的逻辑即可】

=====2021年12月28日

想通过先插入数据(历史所有加班时长),以此sql代替java多次循环(天周日时长是否依次超过班次天周日各自上限)。发到测试发现不行,本地调又可以了,原来方法最上有个@Transactional。导致第一次时,insert数据没到表,查不到,永远ok不超控制。第二次时(第一次的事物已产生了),就又可以了----2021年12月28日12:29:14 乌龙,经测试,发现@Transactional并没有锁数据库行的功能,不影响读。是我代码sql查询写错。。发到测试发现不行,本地调又可以了是因为sum弄成count,上限又设置了1小时,正好多条时count>=2>1,故有此表现。

Logo

华为开发者空间,是为全球开发者打造的专属开发空间,汇聚了华为优质开发资源及工具,致力于让每一位开发者拥有一台云主机,基于华为根生态开发、创新。

更多推荐