跨越多个存储库的Spring数据事务

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但只能在方法级别使用?

Adr*_*hum 7

@Transactional围绕存储库方法进行声明通常是错误的想法。

存储库仅供您访问域实体。业务逻辑通常涉及多个域实体以及它们之间的协作。

在您的架构中,您应该有一个层来组合业务逻辑。这通常对应于暴露给外部的服务。

这通常是您应该设置事务边界的地方。通常它是一个控制器,或者一个服务方法。


xyz*_*xyz 6

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)