我有一个用Hibernate作为ORM的Spring应用程序
在带有@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在事务回滚后会减少顺序吗?还是预言机的临时表撤消此增加?还是Hibernate管理它?换句话说,我的问题是,为什么当我在应用程序控制台中看到从双通道中选择entity_seq.nextval
之后的序列没有变化?
任何帮助都将不胜感激!
但是在事务回滚之后,上面的代码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>
您会看到最后一个赋值(2)是从currval
返回的。如果您看到其他结果,请检查一些缓存效果。
我正在使用spring-test运行JUnit测试,我的代码如下所示 我的问题是我希望我的测试不影响其他测试。所以我想为每个测试创建一些类似回滚的东西。我为此找了很多,但到目前为止一无所获。我使用Hibernate和MySql来实现这个
我们有一个Spring事务回滚问题,其中回滚似乎不起作用 在用注释的服务层方法中,我调用三个不同的类来插入3条记录 中间插入从第四个表执行get以填充描述字段,但此get失败。我希望第一次插入会回滚,但它似乎没有发生 几点: 获取方法抛出运行时异常 我们使用和中定义的。Bean是在中创建的,它被导入到 在层 中没有 注释 我们已经使用了
问题内容: 那里的许多示例都主张对数据库事务进行显式回滚,具体方法如下: 但是,我倾向于这样做: 当发生异常时,我只是依靠未提交事务的隐式回滚。 依靠这种隐式行为有什么问题吗?有人有令人信服的理由为什么我不应该这样做吗? 问题答案: 不,它不是特别需要的,但是我可以想到两个可能是个好主意的原因: 明晰 有人可能会争辩说使用可以更清楚地表明在什么情况下不会进行交易。 释放锁 在处理事务时,重要的是要
问题内容: 有什么方法可以保证应用程序不会在Oracle中释放行锁吗?如果我确保将commit语句放在finally块中,则可以处理意外错误的情况,但是如果应用程序进程在提交前突然中断(或者有人将电源线/局域网电缆拔出),该怎么办。 有没有办法让Oracle在X时间后自动回滚空闲会话?还是在我以某种方式检测到连接丢失时回滚? 根据我所做的实验,如果我在提交某个应用程序进程之前终止了该进程,则行锁将
问题内容: 首先,我在StackOverflow上发现了很多与此相关的线程,但是它们都没有真正帮助我,所以很抱歉提出可能重复的问题。 我正在使用spring-test运行JUnit测试,我的代码如下所示 我的问题是我希望我的测试不影响其他测试。所以我想为每个测试创建类似回滚的内容。我为此进行了很多搜索,但到目前为止我什么都没找到。我为此使用Hibernate和MySql 问题答案: 只需在测试之上
如果我没有捕捉到运行时异常,我就不会得到hibernate异常(不要刷新会话..)