Java 多線程通過 Mybatis 獲取 Oracle 序列值重複問題處理

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

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章