首页 > 其他分享 >在微服务内部,调用另一个微服务,如何保证事务的一致性

在微服务内部,调用另一个微服务,如何保证事务的一致性

时间:2023-01-07 10:12:34浏览次数:32  
标签:事务 调用 服务 var client 一致性

虽然,我们通常建议涉及到事务的情况下,不要在一个微服务里,调用另外一个微服务,但有时也会遇到无法避开的情况,那我们就来看看应该如何保证事务的一致性。

我们先来看看微服务A调用微服务B的伪代码:

//微服务A使用的数据库对象是 DbContextA

using var db = new DbContextA();
using var client = new JMS.RemoteClient();

//获取服务B对象
var serviceB = client.TryGetMicroService<ServiceB>();

//进行一系列数据库操作
db.xxx  

//调用服务B方法
serviceB.UpdateSomething();

//提交数据库事务
db.Commit();

//提交服务B事务
client.CommitTransaction();

在服务A里,进行了一系列数据库的操作,然后调用了服务B的方法,最后提交数据库事务和服务B的事务。

这段代码看着没啥问题,事务好像也是一起提交了。

但是,有种情况,如果数据库事务提交成功后,服务器宕机了,那服务B的事务就没有提交,这样事务的一致性就出问题了。

总结一下,如果你的代码有两个或以上Commit动作,那是无法保证事务一致性的。

那如何保证事务的一致性呢?

其实我们可以参考一下我们微服务框架对外的入口:webapi程序,它就可以同时调用多个微服务,并保证事务的一致性。

所以,依葫芦画瓢,服务A只要用RemoteClient,同时调用服务A和服务B,就可以保证事务的一致性。

那么,我们先把服务A的数据库操作,封装成一个微服务方法,大概如此:

    public class ServiceAController : MicroServiceControllerBase
    {
        public void ExecSomething()
        {
            var db = this.CurrentDBContext;
            db.BeginTransaction();

            .... //进行一系列数据库操作
        }
    }

然后,在服务A刚才运行业务功能的地方,用RemoteClient,同时调用自己和服务B

using var client = new JMS.RemoteClient();
var serviceA = client.TryGetMicroService<ServiceA>();
var serviceB = client.TryGetMicroService<ServiceB>();

//调用服务A的方法
serviceA.ExecSomething();

//调用服务B的方法
serviceB.UpdateSomething();

//提交所有事务
client.CommitTransaction();

这样,就实现了事务的一致性。

标签:事务,调用,服务,var,client,一致性
From: https://www.cnblogs.com/IWings/p/17032163.html

相关文章

  • 双网卡绑定的公网IP,Windows端无法ping通,进而SecureCRT无法连接服务器
    问题描述:双网卡绑定的公网IP,Windows端无法ping通,进而SecureCRT无法连接服务器,如下所示:C:\Users\Administrator>ping192.168.133.103正在Ping192.168.133.103具有32字......
  • 服务器状态码
    服务器状态码Serverstatuscodes定义的一些常量在httpServletResponse.java中查看defaultpublicSupplier<Map<String,String>>getTrailerFields(){returnnu......
  • 28、商品服务--三级分类--新增效果的完成
    使用Elementui的对话框(里面带form表格)给category赋值给后端发送请求......
  • 27、商品服务--三级分类--删除效果细化
    1、希望删除后有一个消息提示使用Elementui的控件2、希望删除子菜单后,父菜单仍然是展开的状态通过Elementui的树形控件的属性来进行控制......
  • 监测服务器资源使用情况
    基础free查看总内存,使用空闲情况 vmstat-查看CPU使用率、内存情况、IO读写情况 ethtool-查看网卡宽带大小 top-实时显示系统中各个进程的资源占用状......
  • “优豆云”"免费虚拟主机"“免费云服务器”
    “优豆云”"免费虚拟主机"“免费云服务器” “优豆云”"免费虚拟主机"“免费云服务器” “优豆云”"免费虚拟主机"“免费云服务器”非常好用非常棒走过路过不要......
  • 26、商品服务--三级分类--逻辑删除
    使用postman进行测试使用mybatisplus提供的逻辑删除功能https://baomidou.com/pages/6b03c5/#%E6%AD%A5%E9%AA%A4-2-%E5%AE%9E%E4%BD%93%E7%B1%BB%E5%AD%97%E6%AE%B5%E4%......
  • Raft一致性共识算法论文学习
    论文地址:https://pdos.csail.mit.edu/6.824/papers/raft-extended.pdf看完raft共识算法,脑袋非常懵,所以写一篇学习笔记,记录一下。raft算法主要解决三个模块的问题:领导人选......
  • 恒创科技:大带宽服务器带宽租用哪个好?
    ​服务器带宽一直是网站重要的资源之一,拥有充足的带宽资源可以有很多好处,比如提高网站速度、提高视频清晰度、防御DDoS攻击、上传下载速度快等等,所以带宽对于网站而言很......
  • vue项目服务器部属源码调试解决办法
    一、问题来源   希望在远程发布的测试服务器上直接启用vscode 的调试模试,来解决项目实际部属时的问题。也就是在调试模式下,会有子域名的问题。二、如何在调试模......