YZR.Data 事務處理(Tranaction)

簡要:      web

      在.net framework中,事務在.net 1.0是經過SqlTranscation類來處理的.在.net 2.0中引入了一個System.Transcations命名空間來對事務進行更增強大的處理.YZR框架都對此進行了一些封裝以供事務的操做.sql

      事務(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.跨庫事務能解決的,就不要用嵌套跨庫事務

相關文章
相關標籤/搜索