gpt4 book ai didi

java - 如何在 Spring 事务管理中调用自定义回滚方法?

转载 作者:IT老高 更新时间:2023-10-28 13:49:13 24 4
gpt4 key购买 nike

环境:Spring 3、自定义事务管理、JDBC 事务

我刚刚阅读了有关使用事务模板处理事务管理的 Spring 文档。 这似乎过于复杂所以我想问:

我的大部分事务都与 JDBC 相关,这意味着我只是在我的服务上声明了一个 @Transactional。但是现在我正在对另一个需要回滚的站点进行 REST 服务调用,如果以下任何 JDBC 操作失败,我将在这种情况下提供回滚代码。

随着我的方法的进展,在我的事务中 - 我想保存对 REST 服务调用的引用(需要回滚该操作),并且在出现异常时我只是 想要一个方法 myCustomRollback() 被调用,它可以访问之前存储的对象。

为什么不在 transactionTemplate 中提供一个映射来存储东西并在 @Transactional 注释上定义自定义回滚方法?

这是我的想法,我没有遵循 Spring 的想法。有人可以帮助我弥合我想要的东西和我如何在 Spring 中最有效地完成它之间的差距吗?我只需要为一些特殊情况操作执行此操作。

最佳答案

致仍在阅读本文的人:

正如 Den Roman 所建议的那样,我解决了与 spring 事件类似的问题。在选项 3 中。这是基本思想(场景是虚构的):

每当我执行需要与事务一起回滚的外部操作时,我都会使用 spring (org.springframework.context.ApplicationEventPublisher 的支持在我的 @Transactional 方法中发布一个事件):

@Transactional
public String placeOrder(Order order) {
String orderId = orderServiceGateway.createOrder(order);
applicationEventPublisher.publishEvent(new OrderCreatedEvent(orderId));
workflowService.startWorkflow(orderId);
return orderId;
}

事件本身可以是任何对象 - 我创建了一个 POJO,其中包含有关要删除的远程实体的详细信息。

然后我注册了一个绑定(bind)到事务阶段的特殊事件监听器——在我的例子中是回滚:

@TransactionalEventListener(phase = TransactionPhase.AFTER_ROLLBACK)
public void rollBackOrder(OrderCreatedEvent orderCreatedEvent) {
String orderId = orderCreatedEvent.getOrderId();
orderServiceGateway.deleteOrder(orderId);
}

当然,建议从回滚操作中捕获并记录异常,不要丢失 placeOrder() 方法中的原始异常。

默认情况下,这些事件是同步的,但可以通过额外的配置使其异步。

这里有一篇关于这个机制的非常好的文章,包括详细的配置和陷阱:Transaction Synchronization and Spring Application Events (DZone)

虽然我不喜欢 100% 的解决方案,因为它用事件发布的东西混淆了业务逻辑并绑定(bind)到 spring,但它确实做了我期望它做的事情,并且可以将上下文从事务方法传递到回滚方法 - 不能通过事务方法之外的传统 try/catch block 使用(除非您将上下文放在异常本身中,这不是很好)。

关于java - 如何在 Spring 事务管理中调用自定义回滚方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5684473/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com