Java 多線程通過 Mybatis 獲取 Oracle 序列值重複問題處理
在同一個事務內開多線程訪問序列值時,會取出同一個值。
select mySequence.nextval from dual
解決方法是將查詢語句放在一個新事務中,同時增加同步約束。
@Transactional(value = 'mytran', propagation = Propagation.REQUIRES_NEW, rollbackFor = {
Exception.class })
@Override
public synchronized Long getNextVal() {
return mapper.getNextVal();
}
另外如果在本類中調用時直接調用時事務不會生效,需要通過接口變更去調用。詳細說明見參考資料2。
// 事務無效
getNextVal();
// 事務有效
myService.getNextVal();
參考資料:
[1]. Oracle Database Online Documentation 12c Release 1 (12.1) / Database Administration / Database SQL Language Reference /CREATE SEQUENCE. https://docs.oracle.com/database/121/SQLRF/statements_6017.
[2]. Spring 下默認事務機制中@Transactional 無效的原因, https://www.cnblogs.com/milton/p/6046699.html