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

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

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

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

  在上一篇文章NET简谈事务、分布式事务处理”中我大概总结了关于.NET中的事务处理方式和结合了WCF框架的简单应用。在事务性操作中我们的重点是能将数据进行可逆化,说白了就是能保证数据的ACID(关于事务的整体模型、原理请参见“.NET简谈事务本质论”一文),在.NET事务处理框架中强大的类库帮我们实现了很多事务传递、事务自动提升的技术难点,同时也提供了很多扩展接口,只要我们肯去研究总能有收获。

  这篇文章主要讲解怎样利用.NET为我们提供的扩展接口进行自定义的事务处理范围内的资源管理,在事务的操作范围内我们不会总是将数据库视为依赖的对象,也不会总是IdbTransaction之类的对象,我们需要自己的事务性资源管理器,我们需要自己的持久性资源管理器。在可能的情况下我们需要自己开发后备持久存储区。

  下面我们将实现一个简单的事务性资源管理器,在此先解释一下关于事务性资源管理器的意思。在我们日常开发过程中,大部分的数据都是存储于数据库中,事务范围内的操作不允许对非事务性资源进行修改因为他们是不可逆的,没有资源管理器对他们进行管理,当事务出错时无法将修改后的数据恢复到事务操作之前的状态,我们只能对数据库中的数据进行修改然后执行回滚,因为数据库中的数据有数据库资源管理器进行强大的管理。

  当我们使用IdbTransaction进行事务处理时其实是获取对远程事务处理的一个引用,比如SqlTransaction对象他就是逻辑上的事务资源管理器,当我们使用TransactionScope进行事务范围操作时,SqlServer数据提供程序能进行自动的事务提升并且进行事务资源登记,在最后能很好的进行二阶段提交协议进行数据的最终提交。

  事务性资源管理器分类:

  .NET事务模型提供了几个接口方便我们实现自定义的资源管理器,我们可以通过继承这些接口实现支持单阶段、两阶段提交协议的资源管理器。

  1、IenlistmentNotification接口:支持两阶段提交协议的资源管理器实现接口。

  (官方解释:描述资源管理器为了在登记参与时为事务管理器提供两阶段提交通知回调而应该实现的接口。)

  2、IsinglePhaseNotification接口:支持单阶段协议的资源管理器实现接口。

  (官方解释:描述支持单阶段提交优化以参与事务的资源对象。)

  3、IpromotableSinglePhaseNotification接口:支持可提升的单阶段提交协议的资源管理器实现接口。(官方解释:描述作为资源管理器内部非分布式事务的提交委托的对象。)这个对象继承自ItransactionPromoter接口,该接口需要自动提升为由MSDTC管理的资源管理器使用的。

  实现System.Transactions.IenlistmentNotification接口,自定义两阶段提交协议的资源管理器

  下面我们通过实现IenlistmentNotification接口来开发一个简单的资源管理器。

  代码1:资源管理器

  1. public class IEnlistmentNotificationDemo<T, Xcopy> : IEnlistmentNotification  
  2.         where T : new()  
  3.         where Xcopy : class 
  4.     {  
  5.         T _commitfrontvalue;  
  6.         T _rollbackfrontvalue = new T();  
  7.         Xcopy copy;  
  8.         public IEnlistmentNotificationDemo(T t, Xcopy icopy)  
  9.         {  
  10.             (icopy as IResourceCopy<T>).Copy(_rollbackfrontvalue, t);  
  11.             _commitfrontvalue = t;//保持对资源修改的引用 
  12.             copy = icopy;  
  13.         } 
  14.         #region IEnlistmentNotification 成员 
  15.         public void Prepare(PreparingEnlistment preparingEnlistment)  
  16.         {  
  17.             //两阶段提交协议中的准备阶段 
  18.             Console.WriteLine("准备提交");  
  19.             ConsoleKeyInfo key = Console.ReadKey();  
  20.             if (key.KeyChar == 'Y' || key.KeyChar == 'y')  
  21.             {  
  22.                 preparingEnlistment.Prepared();  //投票提交事务 
  23.             }  
  24.             else if (key.KeyChar == 'N' || key.KeyChar == 'n')  
  25.             {  
  26.                 Console.WriteLine("\n由我投票整个事务回滚:" + _rollbackfrontvalue);  
  27.                 (copy as IResourceCopy<T>).Copy(_commitfrontvalue, _rollbackfrontvalue);//回滚事务自愿 
  28.                 preparingEnlistment.ForceRollback();//投票回滚事务,资源管理发生错误时因该将其自动回复数据, 
  29.                 //因为事务管理不会通知发生ForceRollback()方法的管理器。 
  30.             }  
  31.         }  
  32.         public void Commit(Enlistment enlistment)  
  33.         {  
  34.             //尝试提交 
  35.             Console.WriteLine("事务尝试提交");  
  36.             enlistment.Done();//通知事务管理器,参与者已完成提交工作 
  37.         }  
  38.         public void Rollback(Enlistment enlistment)  
  39.         {  
  40.             //事务激活阶段处理错误,执行回滚 
  41.             Console.WriteLine("操作失败,回滚" + _rollbackfrontvalue);  
  42.             (copy as IResourceCopy<T>).Copy(_commitfrontvalue, _rollbackfrontvalue);//回滚事务自愿 
  43.             enlistment.Done();  
  44.         }  
  45.         public void InDoubt(Enlistment enlistment)  
  46.         {  
  47.             //与其他的资源管理器失去联系 
  48.             Console.WriteLine("与其他的资源管理器失去联系,通常记录日志");  
  49.             enlistment.Done();  
  50.         } 
  51.         #endregion 
  52.     }

31/3123>
《2023软件测试行业现状调查报告》独家发布~

关注51Testing

联系我们

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

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

沪ICP备05003035号

沪公网安备 31010102002173号