transaction and async

2022/12/06

前言: 昨天在生产上遇到了一个问题。 无缘无故遇到了空指针。但是大部分都是正常的,少部分根据那个key在表中查不到数据。

最后发现是因为外层事务未完成,里面起的异步线程就开始跑了,但是根据key查不到外面方法里要插的数据,因为这个时候外层方法还没有提交.


public class A {
    
    @Transactional
    public void exec() {
        

        /**
         * 事务开始
         */
        
        // insert 操作
        insert(key);
        
        // 调用异步方法
        method(key);

        /**
         * 事务结束
         */
    }
}

public class B {
    @Async
    @Transactional
    public void method(String key) {
        /**
         * 异步操作开始
         */
        selectByKey(key);

        /**
         * 其他操作
         */

    }

}

解决方法:

  1. 将前面的插入操作单独起事务,在异步之前就让事务提交掉。