事务回滚后,oracle undo序列会增加吗?

Mor*_*adi 6 java oracle spring hibernate sequence

我有一个Spring应用程序,其中Hibernate作为ORM,Oracle数据库作为RDBMS。假设数据库中我的表名是entity_tbl并且entity_seq是我的表的顺序。

在带有的save方法中@Transaction,该实体已保存,并且保存该行之后,我为回滚事务抛出异常。像下面一样

@Service
class EntityService extends GenericService<Entity>{

    @Autowired
    EntityRepository repo;

    @Transactional
    @Override
    public void save(Entity entity) {
       repo.save(entity);
       if(true)
           throw ApplicationException("just for Transaction rollback...")
    }
}
Run Code Online (Sandbox Code Playgroud)

在应用程序控制台中,我看到以下行:

select entity_seq.nextval from dual
Run Code Online (Sandbox Code Playgroud)

如果我在PL / SQL上运行此查询,则会entity_seq增加并entity_seq.currval具有新值。但是上述代码中的事务回滚之后entity_seq.currval具有过去的价值,并且没有增加。

所以我的问题是:事务回滚后Oracle是否会减少顺序?还是oracle的temp表撤消了这种增加?还是由Hibernate管理?换句话说,我的问题是为什么select entity_seq.nextval from dual在应用程序控制台中看到之后的顺序没有变化?

任何帮助,将不胜感激!

Mar*_*ber 1

但是在上述代码中的事务回滚之后,entity_seq.currval 具有过去的值并且没有增加。

currval永远不会增加它包含独立于 的最后分配值的序列ROLLBACK

检查没有这些东西的ORM数据库。

SQL> insert into tab(x)
  2  select seq.nextval from dual;

1 row created.

SQL> insert into tab(x)
  2  select seq.nextval from dual;

1 row created.

SQL>
SQL> select * from tab;

         X
----------
         1
         2

SQL>
SQL> select seq.currval from dual;

   CURRVAL
----------
         2

SQL>
SQL> rollback;

Rollback complete.

SQL>
SQL> select * from tab;

no rows selected

SQL>
SQL> select seq.currval from dual;

   CURRVAL
----------
         2

SQL>
Run Code Online (Sandbox Code Playgroud)

您会看到最后分配的值 (2) 从currval. 如果您看到其他结果,请检查一些缓存效果。