简要:
在.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),指一个事务一旦提交,它对数据库中数据的改变就应该是永久性的。接下来的其他操作或故障不应该对其有任何影响。
一:框架IDataBase对SqlTranscation事务的支持
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.跨库事务能解决的,就不要用嵌套跨库事务