前言: 昨天在生产上遇到了一个问题。 无缘无故遇到了空指针。但是大部分都是正常的,少部分根据那个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);
/**
* 其他操作
*/
}
}
解决方法:
- 将前面的插入操作单独起事务,在异步之前就让事务提交掉。