java - Spring @Transactional 方法错误处理
问题描述
我正在使用使用@Transactional
注释的事务方法。我正在尝试使用 JpaRepository 的 save() 方法将对象保存到数据库中。(由于数据库关系的限制,这将引发错误。)
save
现在,当我调试程序时,我发现在事务方法的末尾而不是在调用方法时抛出了异常。这与非事务方法的行为完全不同。
有人可以解释为什么会这样吗?为什么在事务方法结束时抛出异常,而不是在实际应该发生的时候。
我的第二个问题是,当方法是事务性时,抛出异常是DataViolationException
,当它是非事务性时,抛出异常是PSQLException
(使用 Postgres 数据库)。为什么呢?
下面是代码
@Transactional
public ResponseType methodA(UserObject userObject) {
//save call
jpaRepoObject.save(userObject);
//next call will fail due to relational constraints on database
jpaRepoObject.save(userObject); //should throw PSQLException/DataViolationException
return new ResponseType("success"); //Error thrown after this line.
}
解决方案
save
不会立即将数据刷新到底层数据库。首先,实体被保存到一级缓存中,并且,当刷新时间到来时(在事务结束时 - 比如在您的情况下,或者在发出查询时),只有实体才会保存到数据库中。
要查看您期望的行为,请使用saveAndFlush
方法。
推荐阅读
- loops - 在观察 SAS 中将单个观察从数据集发送到用户电子邮件
- java - 相对路径 Java
- python - 如何在循环中从列表中弹出随机项目
- android - JobScheduler 如何知道作业是否已失败以使其重试?
- powershell - 无法在 PowerShell 中修剪字符串
- sql - 特定类型代码无效和方法调用 impex.exportItemsFlexibleSearch 错误
- node.js - 在此环境中未启用请求的功能
- swift - 由于字典,Swift“无法推断复杂的闭包返回类型;添加显式类型以消除歧义”
- python - Python:用于拟合 HMM 模型的进度条?
- swiftui - 在 SwiftUI 中对形状进行分组