事务结束期间的 SQLException 未按预期回滚



我正在使用Eclipselink和Spring事务管理。我希望程序以原子方式插入两组主/详细信息记录,以便要么插入两组,要么两者都不插入。

现在,如果我的显式验证失败,则任一结构代码都会引发异常,回滚会处理它。在处理第二条记录期间引发的错误将回滚第一条记录。

事情变成梨形的地方是当处理第二个事务时出现数据错误,导致在清除/提交过程中出现 SQLException,在这种情况下,似乎只有第二条记录被回滚,第一条记录保留在原位。

我尝试了各种调整。SQLException 通常在验证记录过程中的查找调用期间触发,当生成 flush(( 时,但我尝试更改 EntityManger 设置以关闭自动刷新,尽管在程序的不同点抛出不同的异常,回滚仍然做同样的事情。

我尝试为引发错误的更新请求新事务,但系统说此时无法给我新事务。

我尝试在事务结束前进行刷新,希望捕获 DatabaseException 并转换为回滚的异常。

现在,我可以对验证更加挑剔,减少SQL上数据错误的可能性,但我更愿意确保不会遗漏某些东西。我可以以这种方式修复单元测试,但肯定还有其他方式可以发生这种情况。

哦,将刷新模式设置为"提交"确实会有所不同。在这种情况下,不会回滚任何记录。即使我捕获了持久性异常并抛出我的回滚异常。

好吧,我偶然发现了一个解决方法,只是随机更改内容。翻转持久性.xml从 JTA 到 RESOURCE_LOCAL。现在看起来很好。

最新更新