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

时间:2019-03-04 12:10:24

标签: java spring oracle hibernate sequence

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

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

@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...")
    }
}

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

select entity_seq.nextval from dual

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

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

任何帮助将不胜感激!

1 个答案:

答案 0 :(得分: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>

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