簡要: 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:編程
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(); }
二:存儲過程RPo對SqlTranscation事務的支持併發
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(); }
三:框架IDataBase和RPo共用一個鏈接對象框架
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.跨庫事務能解決的,就不要用嵌套跨庫事務