? 首先我们需要识每一个数据库操作的上下文
在数据库工具类编写的过程中,对事务的措置惩罚惩罚操纵想制止各个原子操纵的事务东西赋值反复操纵,想对外袒露的要领为如下形式
public bool ExecuteTransition(Action TransitionAction, out string ExceptionStr)
外部传入的数据库操纵都使用委托统一打包,内部进行事务操纵。我们首先需要大白的是,数据库事务操纵在ADO.NET的编码中的浮现是,DbConnection为同一个,DbCommand的Transaction为同一个。
首先我们需要识每一个数据库操纵的上下文,,是否在TransitionAction这个委托中,为了简单明了,在执行TransitionAction时开启一个Task,取恰当前线程的ThreadID作为这个事务委托的独一标识,并生成一个DbTransaction放入一个TransactionDic中,在SqlHelper执行类中执行SQL语句创建Connection时,取恰当前的ThreadID去TransactionDic中查找,如果有对应的Transition则说明该SQL语句的执行是在一个事务中,Connection直接取Transition的数据库连接,并给DbCommand的Transition东西赋值
这个解决方案对付TransitionAction中执行要领类中的数据库操纵或其他组合操纵也是可行的,但是对付嵌套事务还需要进一步改造。
好比我封装好一个框架的事情流要领MethodA,自带事物执行,但是需要与业务更新要领MethodB进行事物组合操纵,上述方案并不能满足要求,需要我们进行改造,判断当前的事物TransitionAction是否是嵌套事务,即TransitionActionB实际是打包在TransitionActionA中的。在TransitionAction的DbTransaction添加的过程中,我们需要取到Task之外的ThreadID,这里称作为RootThreadID,同时维护一个ConcurrentDictionary<string, List<string>> TransitionIDMapDic,用于维护RootThreadID与嵌套事务的ThreadID的关系,在创建Task时就可以判断当前的ThreadID是否在TransactionDic,存在就是嵌套事务,需要将当前的TransitionAction合并到Root事物中
温馨提示: 本文由Jm博客推荐,转载请保留链接: https://www.jmwww.net/file/web/31705.html