.NET简谈自定义事务资源管理器

发表于:2012-7-04 09:57

字体: | 上一篇 | 下一篇 | 我要投稿

 作者:王清培    来源:51Testing软件测试网采编

分享:

  该类是支持两阶段提交协议的资源管理器,由于不同的资源面临这不同的数据复制操作。当我们进行初始数据备份的时候需要对不同的数据类型进行不同的数据复制操作,所以我们需要一个规范来进行约定。

  代码2:资源复制接口

  1. /// <summary>  
  2.     /// 事务性资源管理器中的资源拷贝,不同的资源类型存在多种拷贝形式。  
  3.     /// </summary>  
  4.     public interface IResourceCopy<T>  
  5.     {  
  6.         void Copy(T t1, T t2);  
  7. }

  代码3:实现StringBuilder类型的数据复制

  1. /// <summary>  
  2.     /// StringBuilder类型的数据Copy对象,需要实现IResourceCopy泛型接口。  
  3.     /// </summary>  
  4.     public class StringBuilderCopy : IResourceCopy<StringBuilder>  
  5.     {  
  6.  
  7.         #region IResourceCopy<StringBuilder> 成员  
  8.  
  9.         public void Copy(StringBuilder t1, StringBuilder t2)  
  10.         {  
  11.             t1.Remove(0, t1.Length);  
  12.             t1.Append(t2.ToString());  
  13.         }  
  14.  
  15.         #endregion  
  16. }

  这样我们就有了对于StringBuilder类型的数据复制操作类。

  代码4:将自定义的资源管理器参与到事务处理中

  1. /// <summary>  
  2.     /// 事务范围内的登记资源管理对象的状态  
  3.     /// </summary>  
  4.     public class EnlistmentDemo  
  5.     {  
  6.         [MethodImpl(MethodImplOptions.Synchronized)]//锁住当前方法,避免多线程访问破坏事务资源的一致性。  
  7.         public void Start()  
  8.         {  
  9.             //易失性资源  
  10.             StringBuilder stringvalues = new StringBuilder("123");  
  11.             StringBuilder stringvalues2 = new StringBuilder("456");  
  12.             StringBuilder stringvalues3 = new StringBuilder("789");  
  13.             StringBuilder stringvalues4 = new StringBuilder("101112");  
  14.             //使用资源管理器进行管理  
  15.             IEnlistmentNotificationDemo<StringBuilder, StringBuilderCopy> resource =  
  16.                 new IEnlistmentNotificationDemo<StringBuilder, StringBuilderCopy>(stringvalues, new StringBuilderCopy());  
  17.             IEnlistmentNotificationDemo<StringBuilder, StringBuilderCopy> resource2 =  
  18.                  new IEnlistmentNotificationDemo<StringBuilder, StringBuilderCopy>(stringvalues2, new StringBuilderCopy());  
  19.             IEnlistmentNotificationDemo<StringBuilder, StringBuilderCopy> resource3 =  
  20.                 new IEnlistmentNotificationDemo<StringBuilder, StringBuilderCopy>(stringvalues3, new StringBuilderCopy());  
  21.             IEnlistmentNotificationDemo<StringBuilder, StringBuilderCopy> resource4 =  
  22.                  new IEnlistmentNotificationDemo<StringBuilder, StringBuilderCopy>(stringvalues4, new StringBuilderCopy());  
  23.             try 
  24.             {  
  25.                 using (TransactionScope transcope = new TransactionScope())  
  26.                 {  
  27.                     Transaction.Current.TransactionCompleted += new TransactionCompletedEventHandler(commitran_TransactionCompleted);  
  28.                     //登记事务资源管理器,在开始一切事务性操作之前必须先登记资源管理器  
  29.                     Transaction.Current.EnlistVolatile(resource, EnlistmentOptions.None);  
  30.                     Transaction.Current.EnlistVolatile(resource2, EnlistmentOptions.None);  
  31.                     Transaction.Current.EnlistVolatile(resource3, EnlistmentOptions.None);  
  32.                     Transaction.Current.EnlistVolatile(resource4, EnlistmentOptions.None);  
  33.                     //开始事务性操作,该阶段属于事务的激活阶段。  
  34.                     stringvalues.Append("456");  
  35.                     stringvalues2.Append("789");  
  36.                     stringvalues3.Append("101112");  
  37.                     stringvalues4.Append("131415");  
  38.                     transcope.Complete();//开始两阶段提交,该阶段属于事务的准备阶段。  
  39.                 }  
  40.             }  
  41.             catch { Console.WriteLine("事务执行出错,执行回滚"); }  
  42.  
  43.             //查看被事务性操作后的值  
  44.             Console.WriteLine("事务完成后的结果值:");  
  45.             Console.WriteLine(stringvalues + "|" + stringvalues2 + "|" + stringvalues3 + "|" + stringvalues4);  
  46.         }  
  47.  
  48.         //事务结束时触发的事件方法,可以捕获事务执行结果。  
  49.         void commitran_TransactionCompleted(object sender, TransactionEventArgs e)  
  50.         {  
  51.             Console.WriteLine("transaction completed:");  
  52.             Console.WriteLine("ID:             {0}", e.Transaction.TransactionInformation.LocalIdentifier);  
  53.             Console.WriteLine("Distributed ID: {0}", e.Transaction.TransactionInformation.DistributedIdentifier);  
  54.             Console.WriteLine("Status:         {0}", e.Transaction.TransactionInformation.Status);  
  55.             Console.WriteLine("IsolationLevel: {0}", e.Transaction.IsolationLevel);  
  56.         }  
  57.     }

32/3<123>
重磅发布,2022软件测试行业现状调查报告~

关注51Testing

联系我们

快捷面板 站点地图 联系我们 广告服务 关于我们 站长统计

法律顾问:上海兰迪律师事务所 项棋律师
版权所有 上海博为峰软件技术股份有限公司 Copyright©51testing.com 2003-2023
投诉及意见反馈:webmaster@51testing.com; 业务联系:service@51testing.com 021-64471599-8017

沪ICP备05003035号

沪公网安备 31010102002173号