.NET微服务系列之Saga分布式事务案例实践

本文分享了如何使用Wing框架实现跨银行转账的分布式事务,包括创建事务单元、数据传输模型和事务处理逻辑,以及实际操作中的错误处理和事务结束验证。

  自从Wing正式发布以后,很多童鞋反馈对Saga分布式事务比较感兴趣,今天就跟大家分享一下“跨行转账”的分布式事务实践案例,入门使用教程请自行前往gitee-Wing 官方文档  github-Wing 官方文档

假设自己名下有“中国农业银行(ABC)”和“中国工商银行(ICBC)”的账户余额各1万元,现在从“ABC”跨行转账1000元到“ICBC”。对于“ABC”我们创建一个项目名称为

“Saga.Bank.ABC”,“跨行转账”这个动作我们分为两个事务单元来处理:

1、当前账户扣减1000元,定义一个事务单元的数据传输模型(MyAccountUnitModel),一个事务单元的实现类(MyAccountSagaUnit),如果我们定义的事务策略是“向前恢复”,那就只需要实现“Commit”

方法,否则还需要实现 “Cancel”方法,代码如下:

事务单元的数据传输模型(MyAccountUnitModel)

using System;
using Wing.Saga.Client;

namespace Saga.Bank.ABC.TransferSagaUnits
{
    [Serializable]
    public class MyAccountUnitModel : UnitModel
    {
        /// <summary>
        /// 账号
        /// </summary>
        public string BankNo { get; set; }

        /// <summary>
        /// 转出金额
        /// </summary>
        public double Amount { get; set; }
    }
}

事务单元的实现类(MyAccountSagaUnit)

using Microsoft.AspNetCore.Mvc;
using System.Threading.Tasks;
using Wing.Saga.Client;

namespace Saga.Bank.ABC.TransferSagaUnits
{
    /// <summary>
    /// 当前账户操作
    /// </summary>
    public class MyAccountSagaUnit : SagaUnit<MyAccountUnitModel>
    {
        public override Task<SagaResult> Cancel(MyAccountUnitModel model, SagaResult previousResult)
        {
            MyAccount.Balance += model.Amount;
            return Task.FromResult(new SagaResult());
        }

        public override Task<SagaResult> Commit(MyAccountUnitModel model, SagaResult previousResult)
        {
            var result = new SagaResult();
            if (MyAccount.Balance < model.Amount)
            {
                result.Success = false;
                result.Msg = "转账失败,当前账户余额不足!";
            }
            MyAccount.Balance -= model.Amount;
            return Task.FromResult(result);
        }
    }
}

2、调用收款行“ICBC”的接口,同样,也是定义一个事务单元的数据传输模型(TransferOutUnitModel),一个事务单元的实现类(TransferOutSagaUnit),代码如下:

事务单元的数据传输模型(TransferOutUnitModel)


                
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值