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

来源:爱站网时间:2021-09-11编辑:网友分享
我有一个Spring应用程序,Hibernate作为ORM和Oracle数据库作为RDBMS。假设我的数据库中的表名是entity_tbl,而entity_seq是我的表的序列。在保存方法中......

问题描述


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

在使用@Transaction的save方法中,实体是save,在保存行之后,我为rollback transaction抛出了一个异常。如下,

@Service
class EntityService extends GenericService{

    @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没有改变之后的序列?

任何帮助,将不胜感激!

思路:


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

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

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

上一篇:错误org.hibernate.exception.SQLGrammarException:无法提取ResultSet

下一篇:在Java中使用char作为无符号16位值?

您可能感兴趣的文章

相关阅读

热门软件源码

最新软件源码下载