transaction and async

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

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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39

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. 将前面的插入操作单独起事务,在异步之前就让事务提交掉。

Reference