当前位置: 首页 > 知识库问答 >
问题:

在Rest Call之后发生DB Call时的事务问题

嵇丰
2023-03-14

我正在使用Spring Boot,我的应用程序目前只是单片的,以后可能会切换到微服务。

场景1:这里我的数据库调用不依赖于REST响应

@Transactional
class MyService {

    public void DBCallNotDependsOnRESTResponse(){

        //DB Call
        //REST Call, This restcall gives response like 200 "successfull"
    }
}

场景2:这里我的DB调用取决于REST响应

@Transactional
class MyService {

    public void DBCallDependsOnRESTResponse(){

        //REST Call, making a Real Transaction using BrainTree
        //DB Call, HERE DB CALL DEPENDS ON REST RESPONSE
    }
}

在场景1中,我没有任何问题,因为在REST失败的情况下,DB会回滚。

但是,在场景2的情况下,REST调用无法回滚,以防在DB调用时发生任何异常。

我已经在谷歌上搜索了上面的内容,我找到了一些解决方案,比如我们需要使用一些类似Pub-Sub-model系统的东西,但我无法将这个概念清晰地表达出来。

如果有人能为场景2提供解决方案,我将非常高兴。其他电子商务企业如何有效地处理交易,我想我的问题与一些架构设计有关。。请提供一些好的架构方法来解决上述事务问题。你认为使用Kafka这样的信息系统可以解决上述问题吗。。?仅供参考,目前,我的应用程序是单片的,我应该使用微服务吗?我需要使用两阶段提交还是Sagas来解决我的问题?Sagas可以用于单片应用吗?

编辑:关于RestCall:我实际上正在使用BrainTree进行真正的事务,这是一个Rest调用。

共有1个答案

太叔俊侠
2023-03-14

你能详细说明一下你从rest通话中获得了什么吗?您是否正在更新DB调用将使用的任何数据?

如果这两个调用是独立的,那么顺序是否重要?因为db调用将在方法本身的末尾提交

 类似资料:
  • 问题内容: 我在下面使用HIbernate和Spring和JPA。当引发PersistenceException时,我想捕获它并返回错误消息,以便它不会传播到调用者。 但是我得到一个异常,说我需要在异常之后回滚事务,但是当我捕获到异常并且不想重新抛出该异常时,如何回滚它呢? 问题答案: 似乎没有办法回退由Spring ORM管理的失败事务。问题中显示的代码是服务类。将其持久性例程提取到单独的DAO

  • 问题内容: 首先,我在StackOverflow上发现了很多与此相关的线程,但是它们都没有真正帮助我,所以很抱歉提出可能重复的问题。 我正在使用spring-test运行JUnit测试,我的代码如下所示 我的问题是我希望我的测试不影响其他测试。所以我想为每个测试创建类似回滚的内容。我为此进行了很多搜索,但到目前为止我什么都没找到。我为此使用Hibernate和MySql 问题答案: 只需在测试之上

  • 我使用spring 3.2并有一些事务。当我遇到异常时,回滚似乎没有完成。 我的代码 } 基本上,我有一个类X,createX方法启动一个事务。它调用createY谁调用call YY。在这个方法中发生了异常。我在想,那么自createX以来的所有持久操作都将被回滚,但这不是谁发生的 我在日志中没有看到交易信息 任何想法

  • 我有一个fxml文件已经注册了控制器。Controller实现EventHandler和方法句柄(ActionEvente)。如果发生注册事件,处理程序方法中的代码将被处理,但不总是这样。但是打印了以下异常跟踪。我错过了什么吗?

  • 问题内容: 为了了解Spring事务的工作原理,我想知道在以下情况下会发生什么情况,其中一种方法标记为,而另一种方法标记为。 假设配置使用所有默认设置。 现在,如果我要输入,显然可以开始交易。然后,钻进去会发生什么?事务已经存在的事实会导致没有新的事务诞生,还是我在这里创建两个事务? 关于传播的文档(在下面引用)似乎涵盖了这一点,但是我想验证一下我的理解,这对于我的处女大脑来说可以一次理解所有知识

  • 我目前正在Spring玩番石榴的eventbus,虽然一般功能运行良好,但到目前为止,我遇到了以下问题: 当用户希望更改“行”实体上的数据时,这将在后端服务中照常处理。在这个服务中,数据将首先通过JPA持久化,然后我创建一个“NotificationEvent”,引用已更改的实体。通过EventBus,我将线路参考发送给所有订阅者。 eventbus本身是在后台使用new eventbus()创建