休息调用后发生数据库调用时的事务问题

Posted

技术标签:

【中文标题】休息调用后发生数据库调用时的事务问题【英文标题】:Transaction issue when DB Call happens after Rest Call 【发布时间】:2020-08-08 19:27:44 【问题描述】:

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

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

@Transactional
class MyService 

    public void DBCallNotDependsOnRESTResponse()

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

场景 2:我的数据库调用取决于 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 失败的情况下回滚。

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

我已经在谷歌上搜索了上面的内容,我发现了一些解决方案,比如我们需要使用类似 Pub-Sub 模型系统的东西,但我无法清楚地理解这个概念。

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

编辑: 关于 RestCall:我实际上是在使用 BrainTree 进行 Real Transaction,这是一个 Rest Call。

【问题讨论】:

仍在寻找答案.. 这个问题没有完美的答案。一旦您开始其余调用,那么您应该在应用程序端自己处理数据一致性,这意味着如果您需要回滚对 BrainTree 的调用,那么您应该尽可能调用 Braintree 以恢复相应的事务.如果不可能,那么您应该创建一个调用以通过进行休息调用来再次补偿事务。 【参考方案1】:

您能否详细说明您从休息电话中获得了什么?您是否正在更新数据库调用将使用的任何数据?

如果这两个调用是独立的,那么顺序是否重要?由于 db 调用将在方法本身结束时提交

【讨论】:

我刚刚更新了上面的查询,我的 RestCall 基本上是在使用 BrainTree 进行真正的交易 Scenario1,DB和Rest是独立的,但是在scenario2的情况下,Restcall实际上是一个使用BrainTree的REal Transaction,这个response字段应该是用来在DB中更新的,所以DB调用必须在REST 调用

以上是关于休息调用后发生数据库调用时的事务问题的主要内容,如果未能解决你的问题,请参考以下文章

踩坑! spring事务,非事务方法与事务方法执行相互调用

Spring事务之传播机制

服务发生变化时的Angular Lifecycle钩子

分布式事务介绍和事务框架LCN,seata介绍

如何从 Blazor 应用调用休息服务

PDO 事务和函数调用