事务回滚后oracle undo序列是否增加?
来源:爱站网时间:2021-09-11编辑:网友分享
我有一个Spring应用程序,Hibernate作为ORM和Oracle数据库作为RDBMS。假设我的数据库中的表名是entity_tbl,而entity_seq是我的表的序列。在保存方法中......
问题描述
我有一个Spring应用程序,Hibernate作为ORM和Oracle数据库作为RDBMS。假设数据库中的表名是entity_tbl
,entity_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)。如果您看到其他结果,请检查一些缓存效果。