问题描述
我有一个Spring应用程序,Hibernate作为ORM和Oracle数据库作为RDBMS。
假设我的数据库中的表名是entity_tbl
而entity_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
之后的顺序没有改变?
任何帮助,将不胜感激!
1楼
但是在上面代码中的事务回滚之后,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)。
如果您看到其他结果,请检查一些缓存效果。