java - 从 beforeCompletion TransactionSynchronization 回滚事务?
问题描述
我正在使用 SpringTransactionSynchronizationManager
注册beforeCompletion
如下回调:
@Transactional
public void doTransaction() {
//do DB stuff
updateDB();
//register a synchronization
TransactionSynchronizationManager.registerSynchronization(new TransactionSynchronization() {
@Override
public void beforeCompletion() {
if(!isCallApiSuccessful()) {
//rollback the transaction
}
}
});
}
问题是如何从beforeCompletion
回调中回滚事务?抛出异常会起作用吗?
解决方案
抛出异常会起作用吗?
不,它不起作用,因为它beforeCompletion()
是为了清理资源。
根据文档,这是引发异常的效果:
抛出:
java.lang.RuntimeException
- 如果出现错误;将被记录但不会传播(注意:不要在此处抛出 TransactionException 子类!)
如果您想阻止提交,您可能应该实施void beforeCommit(boolean readOnly)
以实现这一目标并在其中抛出一个。
根据文档,这是引发异常的效果: RuntimeException
抛出:
java.lang.RuntimeException
- 如果出现错误;将被传播给调用者(注意:不要在这里抛出 TransactionException 子类!)
推荐阅读
- firefox - 无法从 firefox 上禁用的 matInput 复制文本
- arrays - 如何在python中将字节数组转换为图像
- node.js - 如何在 AWS lambda func 中执行 Linux exec 文件以在 s3 中处理 200 个 imgs?
- testing - 在微控制器上高速测试 SRAM 的软件算法
- robotframework - 如何使用 ${resp}= 添加时间到时间 ${Time} ${delay_time}
- php - 如何在html中调用php的explode函数
- pyomo - libpynumero_ASL 适用于 Windows 吗?
- java - 如何从 FP 转换为 OOP - Java 文本分析
- solr - Sitecore 8.2:索引管理器中未列出所有索引
- scala - 如何使用jsoup提取没有类的div?