zoukankan      html  css  js  c++  java
  • 使用KTM(内核事务管理器)进行文件事务处理

    这样的代码是不会提升为DTC管理的,我们加一行代码:

    public static void StartCopy()
    {
         using (TransactionScope transcope = new TransactionScope())
         {
            IDtcTransaction idtc = TransactionInterop.GetDtcTransaction(Transaction.Current);
             transcope.Complete();
           }
      }

    先解释一下TransactionInterop类的作用,来自MSDN的说明:

    “促进System.Transactions 和以前编写的用于与 MSDTC、COM+ 或 System.EnterpriseServices 进行交互的组件之间的交互。无法继承此类。”

    其实该类主要用来对早期的分布式事务技术进行互操作,比如用来获取DTC相关的COM对象或者用来进行自定义的事务传播,对于复杂的Oletx(Windows平台的二进制通讯协议)协议,我们不需要关心太多核心的东西就能进行分布式事务的传递,这里可能Remoting有这个需求了。[王清培版权所有,转载请给出署名]

    利用TransactionInterop.GetDtcTransaction方法确实能获取到DTC事务接口。

    图1:

    有了TransactionInterop类,我们后面的扩展就方便多了。

    由于KTM是属于非托管实现,操作系统提供了文件操作的事务性API方法:

    非事务处理 API

    事务处理 API

    CreateFile

    CreateFileTransacted

    CopyFileEx

    CopyFileTransacted

    MoveFileWithProgress

    MoveFileTransacted

    DeleteFile

    DeleteFileTransacted

    CreateHardLink

    CreateHardLinkTransacted

    CreateSymbolicLink

    CreateSymbolicLinkTransacted

    CreateDirectoryEx

    CreateDirectoryTransacted

    RemoveDirectory

    RemoveDirectoryTransacted

     通过封装这些方法就能够实现事务性的文件操作,目前.NET没有封装成熟的类库给我们使用,估计在后期的新版本类库中可能会提供。

    那么我们如何使用KTM事务处理呢,很幸运的是通过MSND的连接我们能够获取到微软的事务开发人员编写的源码,下载地址为:

    http://download.microsoft.com/download/f/2/7/f279e71e-efb0-4155-873d-5554a0608523/TxF2007_07.exe

     源码都是通过对上面的API进行封装的,里面涉及到了很多关于内部API和COM之间的通讯细节,我们可以看看老外写的代码是复杂,也是我们学习的榜样。

     上面我们说过只要夸当前应用程序域的事务处理就会自动提升为DTC事务,对于API的调用已经是出于互操作类型的,当前已经出于远程调用,DTC已经具有与托管域的交互实现,所以我们只有通过DTC进入KTM进行操作。这也是MSDN官方的解释。

    图2:

    我们来看一个简单的例子,该例子实现对文件的事务性删除操作。

    例子1:

    public static void StartDelete()
            {
                try
                {
                    using (TransactionScope transcope = new TransactionScope())
                    {
                        Console.WriteLine("输入要删除的文件");
                        string path = Console.ReadLine();
                        Microsoft.KtmIntegration.TransactedFile.Delete(path);
                        Console.WriteLine("是否提交事务处理?");
                        if (Console.ReadLine() == "y")
                            transcope.Complete();
                        else
                            Transaction.Current.Rollback();
                    }
                }
                catch (Exception err) { Console.WriteLine(err); }

    我简单的写了一段测试代码,经过测试是OK的。KTM能很好的结合DTC、LTM进行混合的事务处理,对于我们上面引入的疑问现在能完美的解决了。 

    参考文章:http://msdn.microsoft.com/zh-cn/magazine/cc163388.aspx

    Transaction

     
    摘要: 在本人最近的几篇关于事务处理的文章中,从事务处理的整体概念到具体的C#代码的实践操作基本上都已经能满足日常的开发需求。文章中大部分的事务范围类的操作都是局限于数据库,在本人的“.NET简谈自定义事务资源管理器 ”一文中我虽然实现了一个简单的自定义资源管理器,其实也能满足基本的项目需求,核心功能也实现了,但是对于文件事务操作我们是力不从心的。[王清培版权所有,转载请给出署名] 从数据库到自定义资源管理器都能参与到事务处理中来,在必要的时候保证数据的完整性,那么我们缺一个类型的资源操作,当然您也许早就想问了,关于文件系统的事务操作怎么办?那么关于文件的事务操作是否有成熟的解决方案了,这点在前几年还真没办法,但是最近微软已经发布了关于事务性NTFS系统。都了解NTFS文件系统的优势和好处,比起FAT和其他的什么HPFS文件系统有极大的改进,所以文件事务处理仅支持NTFS格式的文件系统。阅读全文
    posted @ 2012-01-12 20:05 南京.王清培 阅读(329) | 评论 (1) 编辑
    摘要: 在上一篇文章“NET简谈事务、分布式事务处理”中我大概总结了关于.NET中的事务处理方式和结合了WCF框架的简单应用。在事务性操作中我们的重点是能将数据进行可逆化,说白了就是能保证数据的ACID(关于事务的整体模型、原理请参见“.NET简谈事务本质论”一文),在.NET事务处理框架中强大的类库帮我们实现了很多事务传递、事务自动提升的技术难点,同时也提供了很多扩展接口,只要我们肯去研究总能有收获。 这篇文章主要讲解怎样利用.NET为我们提供的扩展接口进行自定义的事务处理范围内的资源管理,在事务的操作范围内我们不会总是将数据库视为依赖的对象,也不会总是IdbTransaction之类的对象,我们需要自己的事务性资源管理器,我们需要自己的持久性资源管理器。在可能的情况下我们需要自己开发后备持久存储区.....阅读全文
    posted @ 2012-01-02 20:03 南京.王清培 阅读(931) | 评论 (2) 编辑
    摘要: 在本人的 “ .NET简谈事务本质论”一文中我们从整体上了解了事务模型,在我们脑子里能有一个全局的事务处理结构,消除对数据库事务的依赖理解,重新认识事务编程模型。 今天这篇文章我们将使用.NET C#来进行事务性编程,从浅显、简单的本地事务开始,也就是我们用的最多的ADO.NET事务处理,然后我们逐渐扩大事务处理范围,包括对分布式事务处理的使用,多线程事务处理的使用。 数据库事务处理 数据库事务处理我们基本都很熟悉了,begin Transaction ……end Transaction,将要进行事务性的操作包在代码段里,为了便于文章有条理的讲解下去,我还是在这里穿插一个简单的小示例,便于与后面的代码进行对比分析阅读全文
    posted @ 2011-12-22 21:37 南京.王清培 阅读(1707) | 评论 (9) 编辑
    摘要: 这篇文章主要介绍一下事务处理的本质。 其实事务处理对我们来说并不陌生,但是很多人对事务处理的理解似乎有点弄不清,觉得事务处理只存在于数据库中。导致这样的结果是有原因的,当我们开始准备学习编程的时候,都是从某些编程语言开始学起,而不像人家的国外会先从概念、原理、模型开始学习,所以我们都会将某些技术与一些语言、平台联系在一起,导致我们学习其他的语言或者平台会很吃力。 在学校里也好还是自学也好,为了很快的上手都会去学习一些工具然后才会慢慢的去学习跟我们日常开发有关系的技术,仅仅是技术实现而不会去追根究底的问“为什么”。其实作为我们软件开发人员来说,为了跟好的发展需要有一个从概念、原理、技术实现这样的一个正确的学习方法或者说是一种梳理过程,只知其然而不知其所以然,这样会很困惑。 进入主题......阅读全文
    posted @ 2011-11-19 13:31 南京.王清培 阅读(1700) | 评论 (11) 编辑
     
  • 相关阅读:
    Java 访问权限字节码
    vscode 写js项目,自动按照eslint保存
    mac 按键符号说明
    下载git单个文件或目录
    生成密码的方式
    git 笔记
    后端数据返回的snake_case格式,但前端的规范为驼峰格式,实现一种snake_case转驼峰的方法
    wireshark 数据协议解析
    MAC App破解之路十一 charles
    生成检查的顺子的表
  • 原文地址:https://www.cnblogs.com/Leo_wl/p/2321107.html
Copyright © 2011-2022 走看看