Mor*_*adi 6 java oracle spring hibernate sequence
我有一个Spring应用程序,其中Hibernate作为ORM,Oracle数据库作为RDBMS。假设数据库中我的表名是entity_tbl
并且entity_seq
是我的表的顺序。
在带有的save方法中@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...")
}
}
Run Code Online (Sandbox Code Playgroud)
在应用程序控制台中,我看到以下行:
select entity_seq.nextval from dual
Run Code Online (Sandbox Code Playgroud)
如果我在PL / SQL上运行此查询,则会entity_seq
增加并entity_seq.currval
具有新值。但是上述代码中的事务回滚之后entity_seq.currval
具有过去的价值,并且没有增加。
所以我的问题是:事务回滚后Oracle是否会减少顺序?还是oracle的temp表撤消了这种增加?还是由Hibernate管理?换句话说,我的问题是为什么select entity_seq.nextval from dual
在应用程序控制台中看到之后的顺序没有变化?
任何帮助,将不胜感激!
但是在上述代码中的事务回滚之后,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>
Run Code Online (Sandbox Code Playgroud)
您会看到最后分配的值 (2) 从currval
. 如果您看到其他结果,请检查一些缓存效果。
归档时间: |
|
查看次数: |
324 次 |
最近记录: |