自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

.NET可逆框架設(shè)計(jì)

開發(fā) 架構(gòu) 后端
前段時(shí)間一直在學(xué)習(xí)和研究.NET事務(wù)處理,慢慢的我發(fā)現(xiàn)可以使用事務(wù)處理來(lái)實(shí)現(xiàn)一種可逆的系統(tǒng)框架。這種框架在一些IT社區(qū)似乎還沒(méi)有見過(guò),但是在我們?nèi)粘i_發(fā)中確實(shí)有這個(gè)需求。所以我花了點(diǎn)時(shí)間深入的研究了一下事務(wù)的原理和使用,實(shí)現(xiàn)了以事務(wù)為紐帶,以資源為操作對(duì)象的可逆框架。

前段時(shí)間一直在學(xué)習(xí)和研究.NET事務(wù)處理,慢慢的我發(fā)現(xiàn)可以使用事務(wù)處理來(lái)實(shí)現(xiàn)一種可逆的系統(tǒng)框架。這種框架在一些IT社區(qū)似乎還沒(méi)有見過(guò),但是在我們?nèi)粘i_發(fā)中確實(shí)有這個(gè)需求。所以我花了點(diǎn)時(shí)間深入的研究了一下事務(wù)的原理和使用,實(shí)現(xiàn)了以事務(wù)為紐帶,以資源為操作對(duì)象的可逆框架。

這里我假設(shè)您對(duì)事務(wù)有了整體的認(rèn)識(shí),也對(duì)自定義事務(wù)管理器有過(guò)了解。[王清培版權(quán)所有,轉(zhuǎn)載請(qǐng)給出署名]

(可以參考本人的:.NET簡(jiǎn)談事務(wù)本質(zhì)論、.NET簡(jiǎn)談自定義事務(wù)資源管理器)

1.    什么是可逆的程序框架

什么叫可逆的?程序的執(zhí)行是可以被無(wú)限制回滾的。

什么叫可逆的框架?實(shí)現(xiàn)了對(duì)可逆功能的封裝,并能通過(guò)簡(jiǎn)單的接口調(diào)用進(jìn)行使用。框架可能有大有小,我想這么稱呼它是為了表達(dá)它的整體性和重要性。

那么到底可逆的需求在哪里?其實(shí)在我們開發(fā)程序的時(shí)候經(jīng)常會(huì)使用事務(wù)來(lái)進(jìn)行業(yè)務(wù)的控制。比如刪除訂單,然后刪除訂單明細(xì)等等,對(duì)于這樣的要求很多,我們只能將邏輯控制在一個(gè)事務(wù)范圍內(nèi),不能在沒(méi)有事務(wù)性的邏輯代碼中編寫這種要求的業(yè)務(wù)功能。等出現(xiàn)未知錯(cuò)誤的時(shí)候在進(jìn)行事務(wù)的回滾。

你也許會(huì)問(wèn),使用原來(lái)的事務(wù)處理不是也能進(jìn)行回滾嗎?當(dāng)然不是這么簡(jiǎn)單的,我們使用事務(wù)回滾時(shí)只能將資源回滾到最初未進(jìn)行事務(wù)處理前的狀態(tài)。(這里不僅僅指的是數(shù)據(jù)庫(kù)事務(wù),而是全局的事務(wù)處理) 我們用圖做個(gè)比較。[王清培版權(quán)所有,轉(zhuǎn)載請(qǐng)給出署名]

傳統(tǒng)的事務(wù)處理圖:

可逆的事務(wù)處理圖:

從這兩幅圖中我們可以很明顯的看出,傳統(tǒng)的事務(wù)處理在事務(wù)處理的過(guò)程當(dāng)中無(wú)法控制中間數(shù)據(jù),也就是說(shuō)無(wú)法對(duì)事務(wù)處理進(jìn)行分段,然后在進(jìn)行統(tǒng)一的提交或回滾。

在可逆框架的事務(wù)處理里我們就可以控制事務(wù)的執(zhí)行階段,在必要的時(shí)候我們只需提交或者回滾某一階段的數(shù)據(jù)。

1.1環(huán)境事務(wù)

在可逆框架的事務(wù)處理圖中,我們看到事務(wù)的開始,然后就進(jìn)行下一步、下一步這樣的操作。在每進(jìn)行一個(gè)下一步操作的時(shí)候,就是進(jìn)入到了一個(gè)子事務(wù)里處理,在.NET中是可以進(jìn)行事務(wù)的嵌套,其實(shí)也就是依賴事務(wù)Dependent Transaction實(shí)現(xiàn)。通過(guò)使用環(huán)境事務(wù)可以讓事務(wù)性感知代碼能自動(dòng)的識(shí)別出您將要使用事務(wù)進(jìn)行操作。所以在每進(jìn)行下一步操作的時(shí)候,只有將當(dāng)前環(huán)境事務(wù)切換為您將依賴的子事務(wù)才行。如果只是單純的使用依賴事務(wù)對(duì)象實(shí)例在使用,那么將無(wú)法進(jìn)行諸多其他的事務(wù)處理。

2可逆框架的實(shí)現(xiàn)原理

由于我們只能控制自定義事務(wù)資源管理器的內(nèi)部實(shí)現(xiàn),所以我們?cè)跇?gòu)建自己的數(shù)據(jù)處理時(shí)問(wèn)題變的簡(jiǎn)單多了。

實(shí)現(xiàn)可逆框架的核心技術(shù)就是使用依賴事務(wù)進(jìn)行事務(wù)的克隆操作。將一個(gè)大的事務(wù)處理邏輯上切割成多了小的事務(wù)操作,然后在進(jìn)行統(tǒng)一的提交或回滾。

在實(shí)現(xiàn)上其實(shí)就是將Committable Transaction對(duì)象進(jìn)行包裝,實(shí)現(xiàn)簡(jiǎn)單的調(diào)用接口。這里參照了環(huán)境代碼的概念,將對(duì)象的生命周期控制在代碼片段中。

2.1自定義資源管理器的實(shí)現(xiàn)

我們需要擴(kuò)展IEnlistmentNotification接口的實(shí)現(xiàn),加入對(duì)“上一步”、“下一步”的數(shù)據(jù)操作。

請(qǐng)看代碼:

  1. View Code   
  2.  /***  
  3.   * author:深度訓(xùn)練  
  4.   * blog:http://wangqingpei557.blog.51cto.com/  
  5.   * **/ 
  6.  using System;  
  7.  using System.Collections.Generic;  
  8.  using System.Text;  
  9.  using System.Transactions;  
  10.    
  11.  namespace ReversibleLib  
  12.  {  
  13.      /// <summary>  
  14.      /// 可逆范圍內(nèi)的資源管理器。  
  15.      /// 可以使用該類對(duì)易失性資源進(jìn)行事務(wù)范圍內(nèi)的管理。在事務(wù)操作范圍內(nèi)進(jìn)行可逆操作。  
  16.      /// </summary>  
  17.      /// <typeparam name="T">需要管理的資源類型</typeparam>  
  18.      /// <typeparam name="Xcopy">資源在使用、恢復(fù)過(guò)程中的數(shù)據(jù)復(fù)制對(duì)象。</typeparam>  
  19.      public class ReResourceManager<T, Xcopy> : IEnlistmentNotification, IReversibleGetResourceData<T>  
  20.          where T : classnew()  
  21.          where Xcopy : class 
  22.      {  
  23.          /// <summary>  
  24.          /// 私有字段。資源的持久引用。  
  25.          /// </summary>  
  26.          T _commitfrontvalue;  
  27.          /// <summary>  
  28.          /// 私有字段。事務(wù)性操作數(shù)據(jù)對(duì)象。  
  29.          /// </summary>  
  30.          T _rollbackfrontvalue = new T();  
  31.          /// <summary>  
  32.          /// 保存數(shù)據(jù)復(fù)制對(duì)象。  
  33.          /// </summary>  
  34.          Xcopy _copy;  
  35.          /// <summary>  
  36.          /// 泛型約束需要,內(nèi)部使用。  
  37.          /// </summary>  
  38.          public ReResourceManager() { }  
  39.          /// <summary>  
  40.          /// 資源管理器內(nèi)部名稱。便于追蹤  
  41.          /// </summary>  
  42.          public string Name { getset; }  
  43.          /// <summary>  
  44.          /// 重載默認(rèn)構(gòu)造函數(shù),使用資源類型和數(shù)據(jù)復(fù)制對(duì)象初始化資源管理器。  
  45.          /// </summary>  
  46.          public ReResourceManager(T t, Xcopy icopy)  
  47.          {  
  48.              (icopy as IResourceCopy<T>).Copy(_rollbackfrontvalue, t);  
  49.              _commitfrontvalue = t;  
  50.              _copy = icopy;  
  51.          }  
  52.    
  53.          #region IEnlistmentNotification 成員  
  54.          public void Prepare(PreparingEnlistment preparingEnlistment)  
  55.          {  
  56.              preparingEnlistment.Prepared();  
  57.          }  
  58.          public void Commit(Enlistment enlistment)  
  59.          {  
  60.              enlistment.Done();  
  61.          }  
  62.          public void InDoubt(Enlistment enlistment)  
  63.          {  
  64.              enlistment.Done();  
  65.          }  
  66.          public void Rollback(Enlistment enlistment)  
  67.          {  
  68.              (_copy as IResourceCopy<T>).Copy(_commitfrontvalue, _rollbackfrontvalue);//回滾事務(wù)  
  69.              enlistment.Done();  
  70.          }  
  71.          #endregion  
  72.    
  73.          #region IReversibleGetResourceData<T> 成員  
  74.          T IReversibleGetResourceData<T>.GetPreviousData()  
  75.          {  
  76.              T result = new T();  
  77.              (_copy as IResourceCopy<T>).Copy(result, _rollbackfrontvalue);  
  78.              return result;  
  79.          }  
  80.          T IReversibleGetResourceData<T>.GetNextData()  
  81.          {  
  82.              T result = new T();  
  83.              (_copy as IResourceCopy<T>).Copy(result, _commitfrontvalue);  
  84.              return result;  
  85.          }  
  86.          #endregion  
  87.      }  
  88.  } 

#p#

2.2可逆框架的入口實(shí)現(xiàn)

我們需要簡(jiǎn)單的調(diào)用就能方便的使用可逆功能,不能以一種新的方式使用。所以這里借鑒了Transaction Scope的設(shè)計(jì)思想。

請(qǐng)看代碼:

  1. View Code   
  2.  /***  
  3.   * author:深度訓(xùn)練  
  4.   * blog:http://wangqingpei557.blog.51cto.com/  
  5.   * **/ 
  6.  using System;  
  7.  using System.Collections.Generic;  
  8.  using System.Text;  
  9.  using System.Transactions;  
  10.    
  11.  namespace ReversibleLib  
  12.  {  
  13.      /// <summary>  
  14.      /// 使代碼成為可逆框架的事務(wù)性代碼  
  15.      /// </summary>  
  16.      public class ReversibleManagerScope : IDisposable  
  17.      {  
  18.          /// <summary>  
  19.          /// 初始化ReversibleManagerScope新的實(shí)例  
  20.          /// </summary>  
  21.          public ReversibleManagerScope()  
  22.          {  
  23.              ReversibleManager._reversibleManager = new ReversibleManager();  
  24.          }  
  25.          /// <summary>  
  26.          /// 使用ReversibleManager對(duì)象構(gòu)造ReversibleManagerScope使用范圍對(duì)象  
  27.          /// </summary>  
  28.          /// <param name="manager">ReversibleManager實(shí)例</param>  
  29.          public ReversibleManagerScope(ReversibleManager manager)  
  30.          {  
  31.              ReversibleManager._reversibleManager = manager;  
  32.          }  
  33.          /// <summary>  
  34.          /// 使用自定義資源管理器構(gòu)造ReversibleManagerScope包裝的環(huán)境ReversibleManager.Current中的對(duì)象實(shí)例。  
  35.          /// </summary>  
  36.          /// <param name="source">IEnlistmentNotification資源管理器</param>  
  37.          public ReversibleManagerScope(IEnlistmentNotification source)  
  38.          {  
  39.              ReversibleManager._reversibleManager = new ReversibleManager(source);  
  40.          }  
  41.          /// <summary>  
  42.          /// 全局上下文ReversibleManager對(duì)象銷毀  
  43.          /// </summary>  
  44.          public void Dispose()  
  45.          {  
  46.              ReversibleManager._reversibleManager = null;  
  47.          }  
  48.          /// <summary>  
  49.          /// 完成整個(gè)操作的提交。該操作將提交事務(wù)棧中的所有依賴事務(wù)  
  50.          /// </summary>  
  51.          public void Completed()  
  52.          {  
  53.              ReversibleManager.Current.Commit();  
  54.          }  
  55.      }  
  56.      /// <summary>  
  57.      /// 可逆模塊的入口。  
  58.      /// ReversibleManager對(duì)事務(wù)對(duì)象的封裝,實(shí)現(xiàn)階段性的事務(wù)提交和回滾。  
  59.      /// </summary>  
  60.      public class ReversibleManager  
  61.      {  
  62.          #region 上下文靜態(tài)ReversibleManager實(shí)例  
  63.          /// <summary>  
  64.          /// 持有對(duì)可逆框架的對(duì)象引用  
  65.          /// </summary>  
  66.          internal static ReversibleManager _reversibleManager;  
  67.          /// <summary>  
  68.          /// 獲取當(dāng)前上下文中可逆框架  
  69.          /// </summary>  
  70.          public static ReversibleManager Current  
  71.          {  
  72.              get { return _reversibleManager; }  
  73.          }  
  74.          #endregion  
  75.    
  76.          #region 構(gòu)造對(duì)象  
  77.          /// <summary>  
  78.          /// 默認(rèn)構(gòu)造函數(shù)  
  79.          /// </summary>  
  80.          public ReversibleManager() { }  
  81.          /// <summary>  
  82.          /// 表示可提交的事務(wù)(主事務(wù))  
  83.          /// </summary>  
  84.          private CommittableTransaction _commiTransaction;  
  85.          /// <summary>  
  86.          /// 支持兩階段提交協(xié)議的資源管理器(主資源管理器)  
  87.          /// </summary>  
  88.          private IEnlistmentNotification _resourceManager;  
  89.          /// <summary>  
  90.          /// 重載構(gòu)造函數(shù),使用自定義資源管理器構(gòu)造可逆模塊的開始。  
  91.          /// </summary>  
  92.          /// <param name="resource">IEnlistmentNotification接口對(duì)象</param>  
  93.          public ReversibleManager(IEnlistmentNotification resource)  
  94.          {  
  95.              _resourceManager = resource;  
  96.              InitLoad(IsolationLevel.Serializable);  
  97.          }  
  98.          /// <summary>  
  99.          /// 重載構(gòu)造函數(shù),使用自定義資源管理器、內(nèi)部事務(wù)范圍的事務(wù)隔離級(jí)別構(gòu)造可逆模型的開始。  
  100.          /// </summary>  
  101.          /// <param name="resource">IEnlistmentNotification接口對(duì)象</param>  
  102.          /// <param name="isolationlevel">IsolationLevel枚舉成員</param>  
  103.          public ReversibleManager(IEnlistmentNotification resource, IsolationLevel isolationlevel)  
  104.          {  
  105.              _resourceManager = resource;  
  106.              InitLoad(isolationlevel);  
  107.          }  
  108.          /// <summary>  
  109.          /// 事務(wù)初始化階段的參數(shù)對(duì)象  
  110.          /// </summary>  
  111.          TransactionOptions _options;  
  112.          /// <summary>  
  113.          /// 重載構(gòu)造函數(shù),使用自定義資源管理器、內(nèi)部事務(wù)范圍的事務(wù)隔離級(jí)別、事務(wù)超時(shí)時(shí)間范圍構(gòu)造可逆模塊的開始。  
  114.          /// </summary>  
  115.          /// <param name="resource">IEnlistmentNotification接口對(duì)象</param>  
  116.          /// <param name="isolationlevel">IsolationLevel枚舉成員</param>  
  117.          /// <param name="span">TimeSpan時(shí)間范圍</param>  
  118.          public ReversibleManager(IEnlistmentNotification resource, IsolationLevel isolationlevel, TimeSpan span)  
  119.          {  
  120.              _options = new TransactionOptions();  
  121.              _options.Timeout = span;  
  122.              InitLoad(isolationlevel);  
  123.          }  
  124.          /// <summary>  
  125.          /// 構(gòu)造CommittableTransaction對(duì)象實(shí)例。  
  126.          /// </summary>  
  127.          /// <param name="level">事務(wù)隔離級(jí)別</param>  
  128.          private void InitLoad(IsolationLevel level)  
  129.          {  
  130.              if (_options == null)  
  131.                  _options = new TransactionOptions();  
  132.              _options.IsolationLevel = level;  
  133.              _commiTransaction = new CommittableTransaction(_options);  
  134.              _commiTransaction.EnlistVolatile(_resourceManager, EnlistmentOptions.None);  
  135.              //作為事務(wù)棧的頭開始整個(gè)可逆結(jié)構(gòu)。  
  136.              _tranStack.Push(_commiTransaction);//壓入事務(wù)棧  
  137.              _resourceStack.Push(_resourceManager);//壓入資源棧  
  138.              //設(shè)置環(huán)境事務(wù),讓所有支持事務(wù)性感知框架的代碼都能執(zhí)行。  
  139.              Transaction.Current = _commiTransaction;  
  140.          }  
  141.          #endregion  
  142.    
  143.          /// <summary>  
  144.          /// 事務(wù)棧,依次存放事務(wù)。  
  145.          /// </summary>  
  146.          private System.Collections.Generic.Stack<Transaction> _tranStack = new Stack<Transaction>();  
  147.          /// <summary>  
  148.          /// 資源棧,依次存放事務(wù)使用的資源。  
  149.          /// </summary>  
  150.          private System.Collections.Generic.Stack<IEnlistmentNotification> _resourceStack = new Stack<IEnlistmentNotification>();  
  151.          /// <summary>  
  152.          /// 階段性事件委托  
  153.          /// </summary>  
  154.          /// <param name="tran">Transaction環(huán)境事務(wù)</param>  
  155.          public delegate void PhaseHanlder(System.Transactions.Transaction tran);  
  156.          /// <summary>  
  157.          /// 下一步事件  
  158.          /// </summary>  
  159.          public event PhaseHanlder NextEvent;  
  160.          /// <summary>  
  161.          /// 上一步事件  
  162.          /// </summary>  
  163.          public event PhaseHanlder PreviousEvent;  
  164.          /// <summary>  
  165.          /// 開始下一步操作  
  166.          /// </summary>  
  167.          /// <typeparam name="S">IEnlistmentNotification接口實(shí)現(xiàn)</typeparam>  
  168.          /// <param name="level">IsolationLevel事務(wù)的隔離級(jí)別(對(duì)全局事務(wù)處理設(shè)置)</param>  
  169.          /// <param name="source">下一步操作的自定義數(shù)據(jù)管理器</param>  
  170.          public void Next<S>(IsolationLevel level, S source)  
  171.              where S : class,IEnlistmentNotification, new()  
  172.          {  
  173.              Transaction tran = _tranStack.Peek();//獲取事務(wù)棧的頂端事務(wù)  
  174.              if (tran == null)  
  175.                  tran = Transaction.Current;//主事務(wù)  
  176.              DependentTransaction depentran = tran.DependentClone(DependentCloneOption.BlockCommitUntilComplete);  
  177.              //將本次事務(wù)處理的資源管理器壓入資源棧中  
  178.              depentran.EnlistVolatile(source, EnlistmentOptions.None);  
  179.              _tranStack.Push(depentran);  
  180.              _resourceStack.Push(source);  
  181.              //切換環(huán)境事務(wù)場(chǎng)景  
  182.              Transaction.Current = depentran;  
  183.              if (NextEvent != null)  
  184.                  if (NextEvent.GetInvocationList().Length > 0)  
  185.                      NextEvent(Transaction.Current);  
  186.          }  
  187.          /// <summary>  
  188.          /// 返回上一步操作  
  189.          /// </summary>  
  190.          /// <typeparam name="T">需要接受的數(shù)據(jù)對(duì)象類型</typeparam>  
  191.          /// <param name="refadd">需要接受的數(shù)據(jù)對(duì)象引用</param>  
  192.          public void Previous<T>(out T refadd) where T : class,new()  
  193.          {  
  194.              Transaction tran = _tranStack.Pop();  
  195.              if (tran == null)//頂層事務(wù)  
  196.                  Transaction.Current.Rollback();  
  197.              // tran.Rollback();//回滾本事務(wù),將觸發(fā)所有克隆事務(wù)的回滾。  
  198.              if (PreviousEvent != null)  
  199.                  if (PreviousEvent.GetInvocationList().Length > 0)  
  200.                  {  
  201.                      //設(shè)置上一步數(shù)據(jù)對(duì)象  
  202.                      refadd = (_resourceStack.Pop() as IReversibleGetResourceData<T>).GetPreviousData();  
  203.                      PreviousEvent(Transaction.Current);  
  204.                      return;  
  205.                  }  
  206.              refadd = new T();//事務(wù)處理異常  
  207.          }  
  208.          /// <summary>  
  209.          /// 提交事物堆棧中的所有事物  
  210.          /// </summary>  
  211.          public void Commit()  
  212.          {  
  213.              if (Transaction.Current is DependentTransaction)  
  214.                  (Transaction.Current as DependentTransaction).Complete();  
  215.              for (int i = 0; i < _tranStack.Count - 1; i++)  
  216.              {  
  217.                  //依賴事務(wù)  
  218.                  (_tranStack.Pop() as DependentTransaction).Complete();  
  219.              }  
  220.              //提交事務(wù),主事務(wù)。必須進(jìn)行克隆主體的提交才能完成所有階段的操作。  
  221.              (_tranStack.Pop() as CommittableTransaction).Commit();  
  222.          }  
  223.          /// <summary>  
  224.          /// 回滾事物堆棧中的所有事物  
  225.          /// </summary>  
  226.          public void RollBack()  
  227.          {  
  228.              if (Transaction.Current is DependentTransaction)  
  229.                  (Transaction.Current as DependentTransaction).Rollback();  
  230.              for (int i = 0; i < _tranStack.Count - 1; i++)  
  231.              {  
  232.                  //依賴事務(wù)  
  233.                  (_tranStack.Pop() as DependentTransaction).Rollback();  
  234.              }  
  235.              //提交事務(wù),主事務(wù)。必須進(jìn)行克隆主體的提交才能完成所有階段的操作。  
  236.              (_tranStack.Pop() as CommittableTransaction).Rollback();  
  237.          }  
  238.      }  
  239.  } 

3.示例

這里我使用了一個(gè)簡(jiǎn)單的String Builder作為資源管理器需要管理的對(duì)象。

請(qǐng)看代碼:

  1. View Code   
  2.  /***  
  3.   * author:深度訓(xùn)練  
  4.   * blog:http://wangqingpei557.blog.51cto.com/  
  5.   * **/ 
  6.  using System;  
  7.  using System.Collections.Generic;  
  8.  using System.Text;  
  9.  using System.Data;  
  10.  using System.Transactions;  
  11.  using ReversibleLib;  
  12.    
  13.  namespace ConsoleApplication1  
  14.  {  
  15.      class Program  
  16.      {  
  17.          static void Main(string[] args)  
  18.          {  
  19.              //構(gòu)造數(shù)據(jù)  
  20.              StringBuilder strbuilder = new StringBuilder();  
  21.              strbuilder.Append("0");//初始數(shù)據(jù)為0  
  22.    
  23.              //資源管理器  
  24.              ReResourceManager<StringBuilder, StringBuilderCopy> strResource =  
  25.                  new ReResourceManager<StringBuilder, StringBuilderCopy>(strbuilder, new StringBuilderCopy());  
  26.              strResource.Name = "0資源管理器";  
  27.              //開始進(jìn)入可逆框架處理環(huán)境  
  28.              using (ReversibleManagerScope reversible = new ReversibleManagerScope(strResource))  
  29.              {  
  30.                  try 
  31.                  {  
  32.                      ReversibleManager.Current.PreviousEvent += new ReversibleManager.PhaseHanlder(Current_PreviousEvent);  
  33.                      ReversibleManager.Current.NextEvent += new ReversibleManager.PhaseHanlder(Current_NextEvent);  
  34.                      strbuilder.Append("1");//首次修改數(shù)據(jù)為01  
  35.    
  36.                      //獲取下一步操作的數(shù)據(jù)  
  37.                      StringBuilder strbuilder2 = (strResource as IReversibleGetResourceData<StringBuilder>).GetNextData();  
  38.                      //構(gòu)造下一步操作的自定義資源管理器  
  39.                      ReResourceManager<StringBuilder, StringBuilderCopy> strResource2 =  
  40.                          new ReResourceManager<StringBuilder, StringBuilderCopy>(strbuilder2, new StringBuilderCopy());  
  41.                      strResource2.Name = "2資源管理器";  
  42.                      ReversibleManager.Current.Next<ReResourceManager<StringBuilder, StringBuilderCopy>>(  
  43.                          System.Transactions.IsolationLevel.Serializable, strResource2);  
  44.                      strbuilder2.Append("2");//第二步修改數(shù)據(jù)為012  
  45.    
  46.                      //返回上一步,也就是回滾對(duì)數(shù)據(jù)進(jìn)行“2”設(shè)置的前一個(gè)狀態(tài)  
  47.                      StringBuilder strbuilder3;  
  48.                      ReversibleManager.Current.Previous<StringBuilder>(out strbuilder3);//獲取上一步使用的數(shù)據(jù),這里應(yīng)該是01  
  49.    
  50.                      reversible.Completed();//提交所有操作  
  51.                      Console.WriteLine(strbuilder3);  
  52.                  }  
  53.                  catch (Exception err)  
  54.                  { Console.WriteLine(err.Message); ReversibleManager.Current.RollBack(); }  
  55.              }  
  56.              Console.ReadLine();  
  57.          }  
  58.    
  59.          static void Current_NextEvent(Transaction tran)  
  60.          {  
  61.              Console.WriteLine("下一步:" + tran.TransactionInformation.LocalIdentifier);  
  62.              Console.WriteLine("下一步:" + tran.TransactionInformation.DistributedIdentifier);  
  63.          }  
  64.          static void Current_PreviousEvent(Transaction tran)  
  65.          {  
  66.              Console.WriteLine("上一步:" + tran.TransactionInformation.LocalIdentifier);  
  67.              Console.WriteLine("上一步:" + tran.TransactionInformation.DistributedIdentifier);  
  68.          }  
  69.      }  
  70.  } 

這里我使用0作為資源的初始數(shù)據(jù),然后進(jìn)入到第一個(gè)環(huán)節(jié),我將它附加了1,然后進(jìn)入到第二個(gè)環(huán)節(jié),我將它附加了2,這里應(yīng)該是012了,但是下面我突然又返回到了上一步,所以最后的數(shù)據(jù)應(yīng)該是01。如果我們需要使用復(fù)雜的數(shù)據(jù)對(duì)象,如常用的Data Table類型,我們一般都是用它來(lái)展現(xiàn)一組數(shù)據(jù),然后對(duì)這組數(shù)據(jù)進(jìn)行一系列的操作。

總結(jié):

這篇文章主要是想介紹一下事務(wù)的另一種使用方式,對(duì)可逆框架的設(shè)計(jì)方向算是一個(gè)拋磚引玉吧,希望大家用的著。

源碼地址:http://files.cnblogs.com/wangiqngpei557/Reversible.zip

原文鏈接:http://www.cnblogs.com/wangiqngpei557/archive/2012/06/24/2560576.html

責(zé)任編輯:林師授 來(lái)源: 博客園
相關(guān)推薦

2012-06-25 09:28:42

.NET可逆框架

2012-01-18 10:20:42

框架設(shè)計(jì)

2016-03-23 11:05:58

Socket開發(fā)框架分析

2020-07-30 10:35:32

Java反射框架設(shè)計(jì)

2009-09-08 09:12:12

LINQ構(gòu)建框架設(shè)計(jì)

2010-09-25 13:09:39

UISymbian

2012-01-10 10:04:43

Node.js

2022-06-15 11:01:59

自定義SPIJava

2011-04-22 09:26:57

MVC設(shè)計(jì)

2021-02-23 08:18:04

Java 反射機(jī)制

2022-10-10 09:11:12

互聯(lián)網(wǎng)存儲(chǔ)系統(tǒng)云計(jì)算

2022-09-15 18:32:13

SPI模型框架

2022-09-25 21:45:54

日志平臺(tái)

2017-04-12 23:33:38

DevOps平衡計(jì)分卡框架

2022-04-03 15:44:55

Vue.js框架設(shè)計(jì)設(shè)計(jì)與實(shí)現(xiàn)

2014-09-23 10:05:55

2013-09-03 09:35:48

無(wú)線客戶端框架設(shè)計(jì)iOS

2013-09-03 09:55:42

iOS無(wú)線客戶端框架設(shè)計(jì)

2013-09-09 10:48:24

iOS無(wú)線客戶端框架設(shè)計(jì)

2022-12-16 12:16:21

點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)