C# TransactionScope 分布式事物使用实例

protected void btnSave_Click(object sender, EventArgs e)
    {
        var order = new BLL.A_OrderInfo().GetModel(this.OrderId);//订单
        if (order != null && IsUpOrder(order.OrderState, order.PayWay, order.PayState))
        {
            var itemIds = Request.Form.GetValues("hdId");
            var proIdList = Request.Form.GetValues("hdProId");//新商品ID
            var proPriceList = Request.Form.GetValues("txtPreProPrice");//优惠价格
            var proNumList = Request.Form.GetValues("txtProNum");//商品数量

            using (var scope = new TransactionScope(TransactionScopeOption.Required, new TransactionOptions { IsolationLevel = IsolationLevel.ReadCommitted }))
            {
                try
                {
                    //订单原来商品
                    var oldOrderPro = new BLL.A_OrderPro().GetList(null, "OrderId=" + order.OrderId, null);
                    //备份原来订单商品
                    new BLL.A_OrderProBak().Add(oldOrderPro);
                    //还原订单原来商品库存
                    Common.OperGoodsStockAndInsert(order.OrderId, order.OrderCode, 0, (int)Enums.StockRemarkType.修改订单商品增加库存, (int)Enums.StockType.虚拟库存, "虚拟库存-修改订单商品增加库存-正品-入库");
                    var newOrderPro = this.AddNewOrderPro(order.OrderId, order.OrderCode, itemIds, proIdList, proPriceList, proNumList);
                    if (newOrderPro != null)
                    {
                        //删除订单原来商品
                        new BLL.A_OrderPro().DeleteByOrderId(order.OrderId);

                        //修改订单金额
                        int oldStatus = order.OrderState;//保存原始订单状态
                        order.GoodsAmount = Util.GetDecimal(txtGoodsAmount.Text);//商品金额
                        order.IntegralMoney = Util.GetDecimal(txtIntegralMoney.Text);//积分抵扣金额
                        order.CouponAmount = Util.GetInt(txtCouponAmount.Text);//优惠卷抵扣金额
                        order.OrderFreight = Util.GetDecimal(txtOrderFreight.Text);//运费金额
                        order.OrderAmount = Util.GetDecimal(txtOrderAmount.Text);//订单金额
                        order.PayAmount = Util.GetDecimal(txtPayAmount.Text);//已支付金额
                        order.NeedPayAmount = Util.GetDecimal(txtNeedPayAmount.Text);//应支付金额
                        if (order.NeedPayAmount == 0 && order.PayWay != (int)Enums.OrderPayWay.NotPay && order.PayState == (int)Enums.PayState.未支付)
                        {
                            order.PayWay = (int)Enums.OrderPayWay.NotPay;
                            order.PayState = (int)Enums.PayState.已支付;
                            order.OrderState = (int)Enums.OrderState.等待处理中;

                        }
                        if (order.NeedPayAmount > 0 && order.PayWay == (int)Enums.OrderPayWay.NotPay)
                        {
                            order.PayWay = (int)Enums.OrderPayWay.Bill99;
                            order.PayState = (int)Enums.PayState.未支付;
                            order.OrderState = (int)Enums.OrderState.等待支付中;
                        }
                        new BLL.A_OrderInfo().Update(order);

                        //写订单状态日志
                        OperOrderLog(oldStatus, order);

                        //添加订单新商品
                        new BLL.A_OrderPro().Add(newOrderPro);
                        //减少订单新商品库存
                        Common.OperGoodsStockAndInsert(order.OrderId, order.OrderCode, 1, (int)Enums.StockRemarkType.修改订单商品减少库存, (int)Enums.StockType.虚拟库存, "虚拟库存-修改订单商品扣库存-正品-出库");
                        scope.Complete();

                        JScript.Alert("修改订单成功");
                        JScript.Redirect("/SysManager/OrderManager/OrderEdit.aspx");
                    }
                }
                catch (Exception ex)
                {
                    throw new Exception("发送信息异常,原因:" + ex.Message);
                }
                finally
                {
                    scope.Dispose();
                }
            }
        }
        else
        {
            JScript.Alert("此订单不能修改");
            JScript.Redirect("/SysManager/OrderManager/OrderEdit.aspx");
        }
    }

    //是否可以修改
    private bool IsUpOrder(int orderState, int payWay, int payState)
    {
        if (orderState <= (int)Enums.OrderState.已发送到仓储)//&& (payWay == (int)Enums.OrderPayWay.NotPay || payState == (int)Enums.PayState.未支付)
            return true;
        else
            return false;
    }
时间: 2025-02-01 23:58:32

C# TransactionScope 分布式事物使用实例的相关文章

关于java RMI分布式程序开发实例

关于java RMI分布式程序开发实例   作者: javaboy2012 Email:yanek@163.com qq:    1046011462   一. 服务器端     接口定义:注意必须继承Remote接口 package com.yanek.rmi.server; import java.rmi.Remote; import java.rmi.RemoteException; import java.util.List; public interface ChannelManage

spring分布式事物-atomikos mssql报错Error in recovery以及找不到存储过程

问题描述 atomikos mssql报错Error in recovery以及找不到存储过程 如题,我使用atomikos做spring分布式事物,同时支持Oracle.MySQL和MSSQL三种数据源.目前Oracle和MySQL都能调通,在测试MSSQL的过程中,一直报错. 错误如下: 2015-06-03 14:08:45,911 WARN com.atomikos.datasource.xa.XATransactionalResource.logWarning:24 - Error i

通过第三方(如财付通)充值如何做分布式事物?

问题描述 RT, 解决方案 解决方案二:财付通这个是异步的通知,不存在事务的问题吧解决方案三:就比如我们这边财付通那边充值成功了,我们这边保存数据时候失败了,怎么办....解决方案四:引用2楼yu929927571的回复: 就比如我们这边财付通那边充值成功了,我们这边保存数据时候失败了,怎么办.... 你们保存数据失败是你们自己的事情,难道还要财付通退钱么,照这么搞法你们老板肯定要把你们都炒鱿鱼,哪有把收进来的钱退出去的道理?失败了就重试,财付通要求收到你们成功处理的通知,不然会一直给你们发通知

分布式事物TransactionScope的正确用法

正确的写法应该如下 如果A类是使用数据库资源的. class  A { SqlConnection cn=null; public A() { ..... cn.open(); } } //开始事务 using(transactionscope scope=new transactionscope()) { //要确保对支持事务的资源的登记放在此范围内,如数据库资源的打开 A a=new A(); a.method(); ..... scope.comlete() } 我们只要确保数据库的打开操

SQLSERVER分布式事务使用实例_MsSql

复制代码 代码如下: --BEGIN DISTRIBUTED TRANSACTION [transactionname]--标志一个由分布式事务处理协调器MSDTC管理的TSQL分布式事务开始--SERVER A服务器为主控服务器.当连接发出后续COMMIT TRANSACTION或--ROLLBACK TRANSACTION语句时,主控服务器请求MSDTC在所涉及的服务器间管理--分布式事务的完成 --SQLSERVER使用链接服务器或者远程服务器作为分布式事务处理的平台,提供--远程存储过程

SQLSERVER分布式事务使用实例

复制代码 代码如下:--BEGIN DISTRIBUTED TRANSACTION [transactionname]--标志一个由分布式事务处理协调器MSDTC管理的TSQL分布式事务开始--SERVER A服务器为主控服务器.当连接发出后续COMMIT TRANSACTION或--ROLLBACK TRANSACTION语句时,主控服务器请求MSDTC在所涉及的服务器间管理--分布式事务的完成 --SQLSERVER使用链接服务器或者远程服务器作为分布式事务处理的平台,提供--远程存储过程调

win7 64 位下使用分布式事物报错

问题描述 各位大侠大家好.我现在遇到一个问题..我是WIN764位的系统,使用TransactionScope时候报试图加载格式不正确的程序.(异常来自HRESULT:0x8007000B)错误..备注:我电脑装了一个ORACLE64位的服务端,一个ORACLE32位的客户端,,这样做事因为PLSQL支持64位,所以才装了个32位的客户端..我在虚拟机只装了一个ORACLE服务的电脑上试没有问题..并且我编辑死或坏选的是X86,肯定就是32位的客户端问题导致,,请大家给点建议..stringst

python连接KAFKA分布式消息系统实例教程

最近项目中总是跟java配合,我一个写python的程序员,面对有复杂数据结构的java代码转换成python代码,确实是一大难题,有时候或多或少会留有一点坑,看来有空还得看看java基础.这不今天又开始让我们连接kafka啦.公司的kafka跟zookeeper做了群集,连接比较麻烦,具体如何使用,java那面做的封装我也看不到,所以只能通过简单的沟通. 开始 开始肯定去找python连接kafka的标准库,kafka-python和pykafka 前者使用的人多是比较成熟的库,后者是Sams

MySQL分布式事务(XA事务)

MySQL分布式事务(XA事务) 官网:https://dev.mysql.com/doc/refman/5.7/en/xa.html 1.什么是分布式事务 分布式事务就是指事务的参与者.支持事务的服务器.资源服务器以及事务管理器分别位于不同的分布式系统的不同节点之上.以上是百度百科的解释,简单的说,就是一次大的操作由不同的小操作组成,这些小的操作分布在不同的服务器上,且属于不同的应用,分布式事务需要保证这些小操作要么全部成功,要么全部失败.本质上来说,分布式事务就是为了保证不同数据库的数据一致