当前位置: 代码迷 >> java >> 事务回滚后oracle undo序列是否增加?
  详细解决方案

事务回滚后oracle undo序列是否增加?

热度:30   发布时间:2023-07-26 13:54:34.0

我有一个Spring应用程序,Hibernate作为ORM和Oracle数据库作为RDBMS。 假设我的数据库中的表名是entity_tblentity_seq是我的表的序列。

在使用@Transaction的save方法中,实体是save,在保存行之后,我为rollback 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...")
    }
}

在应用程序控制台中我看到这一行:

select entity_seq.nextval from dual

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

所以我的问题是:Oracle在事务回滚后是否会减少序列? 还是oracle的临时表撤消这个增加? 还是Hibernate管理它? 换句话说,我的问题是为什么在我看到select entity_seq.nextval from dual应用select entity_seq.nextval from dual之后的顺序没有改变?

任何帮助,将不胜感激!

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

currval永远不会增加它包含最后一个赋值的序列,而与ROLLBACK无关。

在没有ORM内容的情况下ORM DB。

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)。 如果您看到其他结果,请检查一些缓存效果。

  相关解决方案