Rob*_*son 5 java spring hibernate spring-data
我需要使用同一事务将2个不同的实体插入2个不同的表中。如果第二个插入失败,则应回滚第一个。
有什么办法可以很好地做到这一点?
伪代码:
start tx
repo1.save(myEntity);
repo2.save(anotherEntity);
try commit
Run Code Online (Sandbox Code Playgroud)
我知道您可以利用,@Transactioal但只能在方法级别使用?
@Transactional围绕存储库方法进行声明通常是错误的想法。
存储库仅供您访问域实体。业务逻辑通常涉及多个域实体以及它们之间的协作。
在您的架构中,您应该有一个层来组合业务逻辑。这通常对应于暴露给外部的服务。
这通常是您应该设置事务边界的地方。通常它是一个控制器,或者一个服务方法。
1)您需要检查是否未设置autocommit = false。
2)将保存操作包装为一种服务方法,并使其成为@Transactioal。但是如果你用save()自定义方法,请检查未将传播级别为required_new或嵌套的标记为@Transactioal保存。如果需要,可以使用REQUIRES_NEW保存服务方法,以使该服务方法事务独立于其他事务。
您也可以使用TransactionTemplate包装。
@Autowired
private TransactionTemplate transactionTemplate;
transactionTemplate.execute(new TransactionCallbackWithoutResult() {
@Override
public void doInTransactionWithoutResult(TransactionStatus transactionStatus) {
repo1.save(myEntity);
repo2.save(anotherEntity);
});
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
2408 次 |
| 最近记录: |