我有一个Spring应用程序,其中Hibernate作为ORM,Oracle数据库作为RDBMS。假设我在数据库中的表名是entity_tbl
,而entity_seq
是我表的顺序。
在使用@Transaction
的save方法中,该实体已保存,并且在保存行之后,我为回滚事务抛出异常。像下面一样,
@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的temp表撤消了这种增加?还是由Hibernate管理?换句话说,我的问题是,为什么在应用程序控制台中看到select entity_seq.nextval from dual
之后的顺序没有变化?
任何帮助将不胜感激!
答案 0 :(得分:1)
但是在上面代码中的事务回滚之后,entity_seq.currval具有过去的值并且没有增加。
currval
永远不会增加包含最后一个与ROLLBACK
独立的值的序列。
检入没有ORM
东西的纯数据库。
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)。如果您看到其他结果,请检查一些缓存效果。