简要:     

      在.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.跨库事务能解决的,就不要用嵌套跨库事务

 

 

posted on 2015-12-07 18:44  巴夫巴夫  阅读(209)  评论(0编辑  收藏  举报