当多个线程在同一事务内访问序列值时,将检索到相同的值。
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]。 12c 1(12.1) //SQL/ .
[2]。 @之所以在默认事务机制下无效,