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

 

你可能感兴趣的:(Java 多线程通过 Mybatis 获取 Oracle 序列值重复问题处理)