【问题标题】:Does oracle undo sequence increase after transaction rollback?事务回滚后oracle undo序列是否增加?
【发布时间】:2019-07-25 18:00:42
【问题描述】:

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

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

任何帮助将不胜感激!

【问题讨论】:

  • 我不确定您的观察是否正确,根据 this answer 和许多其他 Oracle 不回滚序列值。您确定价值减少了吗?
  • @karol-dowbecki 我的问题是为什么nextval 之后的序列没有改变?
  • @MortezaAsadi 问题是众所周知的是序列不会回滚。你确定select entity_seq.nextval from dual实际上是在数据库中执行的吗?例如,它可能是 Hibernate 中的标识符缓存,ids 被批量加载以避免在每次插入时获取序列值。
  • @karol-dowbecki 我不确定这个查询实际上是否在数据库中执行,但它记录在我的应用程序控制台中,就像其他 select/insert/delete/update 查询一样。事实上,我希望像其他记录的查询一样,这个查询也将在数据库中执行。

标签: java spring oracle hibernate sequence


【解决方案1】:

但在上述代码中的事务回滚后,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>

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-12-31
    • 2010-11-30
    • 2022-01-15
    • 2015-12-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-07-21
    相关资源
    最近更新 更多