【发布时间】:2019-07-25 18:00:42
【问题描述】:
我有一个 Spring 应用程序,其中 Hibernate 作为 ORM,Oracle 数据库作为 RDBMS。假设我在数据库中的表名是entity_tbl,entity_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