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序列值时出现重复的问题,并提出了解决方案。通过将查询语句置于新事务中并增加同步约束,可以避免序列值重复。此外,还讨论了如何确保事务有效性。
9405

被折叠的 条评论
为什么被折叠?



