• YZR.Data 事务处理(Tranaction)


    简要:     

          在.net framework中,事务在.net 1.0是通过SqlTranscation类来处理的.在.net 2.0中引入了一个System.Transcations命名空间来对事务进行更加强大的处理.YZR框架都对此进行了一些封装以供事务的操作.

          事务(Transaction)是访问并可能更新数据库中各种数据项的一个程序执行单元(unit)。事务通常由高级数据库操纵语言或编程语言(如SQL,C++或Java)书写的用户程序的执行所引起,并用形如begin transaction和commit transaction或 rollback transaction语句(或函数调用)来界定。

    ACID:

    事务是恢复和并发控制的基本单位。
    事务应该具有4个属性:原子性、一致性、隔离性、持续性。这四个属性通常称为ACID特性
    原子性(atomicity)。一个事务是一个不可分割的工作单位,事务中包括的诸操作要么都做,要么都不做。
    一致性(consistency)。事务必须是使数据库从一个一致性状态变到另一个一致性状态。一致性与原子性是密切相关的。
    隔离性(isolation)。一个事务的执行不能被其他事务干扰。即一个事务内部的操作及使用的数据对并发的其他事务是隔离的,并发执行的各个事务之间不能互相干扰。
    持久性(durability)。持续性也称永久性(permanence),指一个事务一旦提交,它对数据库中数据的改变就应该是永久性的。接下来的其他操作或故障不应该对其有任何影响。
     
    一:框架IDataBaseSqlTranscation事务的支持
    beginTransaction()会依据已打开的SqlConnection对象创建事务SqlTranscation对象.
    RCommit():提交事务

    Rrollback():回滚事务
                IDataBase action = RUtility.Instance.GetDbUtility(TableName);
                try
                {
                    action.ROpen();
                    action.beginTransaction();
                    RDic dic = new RDic();
                    dic.Add(SYS_ADMIN.USERNAME.ToString(), "YZR123");
                    dic.Add(SYS_ADMIN.SYSID.ToString(), "1");
                    action.Update(dic, SYS_ADMIN.SYSID, true);
                    dic.Insert("ErrorCol", "ErrorValue");
                    action.Update(dic, SYS_ADMIN.SYSID, true);
                    action.RCommit();
                }
                catch (Exception ex)
                {
                    string ms = ex.Message;
                    action.Rrollback();
                }
                finally
                {
                    action.RClose();
                }

    二:存储过程RPoSqlTranscation事务的支持

    RBeginTranscation()会依据已打开的SqlConnection对象创建事务SqlTranscation对象.
    RCommit():提交事务

    RRollBack():回滚事务
                RPro rp = new RPro();
                try
                {
                    rp.ROpen();
                    rp.RBeginTranscation();
                    string sql = SqlCode.FileList["TranscationDemo1"];
                    rp.ExecuteNonQuery(sql);
                    //rp1.ROpen();
                    sql = SqlCode.FileList["TranscationDemo2"];
                    rp.ExecuteNonQuery(sql);
                    rp.RCommit();
                }
                catch (Exception ex)
                {
                    string ms = ex.Message;
                    rp.RRollBack();
                }
                finally
                {
                    rp.RClose();
                }

    三:框架IDataBaseRPo共用一个连接对象

    RPro rp = new RPro(action);
                IDataBase action = RUtility.Instance.GetDbUtility(TableName);
                try
                {
                    action.ROpen();
                    action.beginTransaction();
                    RDic dic = new RDic();
                    dic.Add(SYS_ADMIN.USERNAME.ToString(), "YZR123");
                    dic.Add(SYS_ADMIN.SYSID.ToString(), "1");
                    action.Update(dic, SYS_ADMIN.SYSID, true);
                    RPro rp = new RPro(action);
                    string sql = SqlCode.FileList["TranscationDemo1"];
                    rp.ExecuteNonQuery(sql);
                    //rp1.ROpen();
                    sql = SqlCode.FileList["TranscationDemo2"];
                    rp.ExecuteNonQuery(sql);
                    action.RCommit();
                }
                catch (Exception ex)
                {
                    string ms = ex.Message;
                    action.Rrollback();
                }
                finally
                {
                    action.RClose();
                }

    四:隐式分布式事务RTransaction

    TransactionScopeOption支持三种值:RequiresNew,Required,Supress.

    TransactionOptions:可以定义级别IsolationLevel,过期时间TimeSpan
    CreateSingleConnTransactionScope(SqlList):基于默认的连接对象,创建单个SqlConnection对象的Transcation.

    RTComplete():事务处理
                RTransaction rts = new RTransaction(TransactionScopeOption.RequiresNew, 
                    new TransactionOptions() { IsolationLevel = System.Transactions.IsolationLevel.ReadUncommitted });
                try
                {
                    List<string> list = new List<string>();
                    list.Add(SqlCode.FileList["TranscationDemo1"]);
                    list.Add(SqlCode.FileList["TranscationDemo2"]);
                    rts.CreateSingleConnTransactionScope(list);
                    rts.RTComplete();
                }
                catch (Exception)
                {
    
                }
                finally
                {
                    rts.RTDispose();
                }
    在同一RTransaction内处理多个数据库,实现跨库事务.
    CreateSingleConnTransactionScope("connString", list)
    :根据WebConfig节点值创建SqlConnection.
                //多连接Connection支持
                RTransaction rts = new RTransaction(TransactionScopeOption.RequiresNew,
                   new TransactionOptions() { IsolationLevel = System.Transactions.IsolationLevel.ReadUncommitted });
                try
                {
                    List<string> list = new List<string>();
                    list.Add(SqlCode.FileList["TranscationDemo1"]);
    
                    rts.CreateSingleConnTransactionScope(list);              //==>两个独立的Connection
                    list.RemoveAll(c => true);
                    //--------------------------------------------------------
                    list.Add(SqlCode.FileList["TranscationDemo2"]);
                    rts.CreateSingleConnTransactionScope("connString", list); //==>两个独立的Connection
                    rts.RTComplete();
                }
                catch (Exception ex)
                {
                    string ms = ex.Message;
                }
                finally
                {
                    rts.RTDispose();
                } 

       嵌套的SqlConnection支持:

    InitDefaultConnObj():初始化默认连接对象.
    InitConfigKeyConnObj("ConfigKey"):根据webconfig节点初始化SqlConnection对象.

    Execute():执行Sql体.

    RClose() :最近一个SqlConnection对象关闭.

    SelectConnClose():关闭默认的连接对象.
    SelectConnClose(ConfigKey):关闭指定连接对象.
                RTransaction rts = new RTransaction(TransactionScopeOption.RequiresNew,
                   new TransactionOptions() { IsolationLevel = System.Transactions.IsolationLevel.ReadUncommitted });
                try
                {
                    List<string> list = new List<string>();
                    list.Add(SqlCode.FileList["TranscationDemo1"]);
    
                    rts.InitDefaultConnObj();
    
                    rts.InitConfigKeyConnObj("connString1");
                    rts.Execute(list);
    
                    list.RemoveAll(c => true);
    
                    rts.InitConfigKeyConnObj("connString2");            //嵌套的数据库连接对象
                    list.Add(SqlCode.FileList["TranscationDemo2"]);
                    rts.Execute(list);
    
                    rts.RClose();
                    rts.SelectConnClose("connString1");
                    rts.SelectConnClose();
                    //rts.RCloseAll();
    
                    rts.RTComplete();
                }
                catch (Exception ex)
                {
                    string ms = ex.Message;
                }
                finally
                {
                    rts.RTDispose();
                } 

    五:显示事务RCommittableTransaction处理

    支持跨库,嵌套事务.

    BeginTranscation(),CreateSingleConnTransaction(),EndTranscation(),Commit(),RollBack()
                RCommittableTransaction rc = new RCommittableTransaction();
                
                List<string> list = new List<string>();
                list.Add(SqlCode.FileList["TranscationDemo1"]);
                list.Add(SqlCode.FileList["TranscationDemo2"]);
                try
                {
                    rc.BeginTranscation();
                    rc.CreateSingleConnTransaction(list);
                    rc.EndTranscation();
    
                    rc.BeginTranscation("connString2");
                    rc.CreateSingleConnTransaction(list);
                    rc.EndTranscation("connString2");
    
                    rc.Commit();
                }
                catch (Exception ex)
                {
                    string ms = ex.Message;
                    rc.RollBack();
                }
                finally
                {
                    rc.Dispose();
                }

    异步提交事务AsyncCommit():

                RCommittableTransaction rc = new RCommittableTransaction();
                
                List<string> list = new List<string>();
                list.Add(SqlCode.FileList["TranscationDemo1"]);
                list.Add(SqlCode.FileList["TranscationDemo2"]);
                try
                {
                    rc.BeginTranscation();
                    rc.CreateSingleConnTransaction(list);
                    rc.EndTranscation();
                    rc.AsyncCommit();
                }
                catch (Exception ex)
                {
                    string ms = ex.Message;
                    rc.RollBack();
                }
                finally
                {
                    rc.Dispose();
                }

         需要跨库事务需要开启服务Distributed Transaction Coordinator
                
         建议以此顺序进行事务选择,
         比如,

         1.框架事务或者存储过程事务能处理的就不要用分布式事务.
         2.隐式跨库事务能解决的,就不要用显示事务.
         3.跨库事务能解决的,就不要用嵌套跨库事务

  • 相关阅读:
    PbootCMS按钮权限控制
    vueadmintemplate顶部一级菜单 侧栏二级菜单
    git常用命令
    MeEdu开发插件之【视图】
    MeEdu开发插件
    MeEdu开发插件之【模型】
    .Net 5.0 通过IdentityServer4实现单点登录之客户端通过授权码换取IdToken和AcessToken并访问Api部分源码解析
    供应链需求调研CheckList
    云计算参考架构几例
    数据库 随机字符串
  • 原文地址:https://www.cnblogs.com/Francis-YZR/p/5027090.html
Copyright © 2020-2023  润新知