• 【ITOO 4】WCF中,分布式事务处理


    导读:事务可以确保除非事务性单元内的所有操作都成功完成,否则不会永久更新面向数据的资源。通过将一组相关操作组合为一个要么全部成功要么全部失败的单元,可以简化错误恢复并使应用程序更加可靠。在项目中,就有一个地方需要用到事务处理。现在,就总结在项目中遇到的分布式事务实现。


    一、问题概述

    1.1,需求简介

    在实现ITOO注册的时候,有三个非常重要的步骤:动态建库,向后台公共数据库多表写入数据,向新库多表写入数据。这几个的关系是,向后台写数据,就意味着建库成功,建库成功,还要求向新库写入默认资源成功,所以,这三者,要么同时实现,要么都不实现。在这里,就必须添加事务处理。

    我们的项目,用的是MVC+WCF+EF框架,刚开始一看这个问题,就被这种框架给吓到了,想了很多办法,都没有实现。后来,解决了之后,才发现事情不是我们想的那样的。

    1.2,解决方案描述

    现在的理解,所谓的分布式事务处理,其实就是一个连接多数据库服务器的事务处理。一般的事务处理,只能连接一个数据库服务器,那么着实要解决的,就是多个数据库服务器的连接处理问题。在这一步查了不少资料,最后,感谢贴心服务的微软,因为,解决方案,就是启动微软提供了一个服务就OK了。


    二、事务简介

    2.1,事务管理器类型

    1:轻量级事务管理器:作用于开启事务的应用程序域,只能包含一个持久化资源,如果再添加一个持久化资源,将被轻量级事务管理器忽略。但是可以登记多个易失资源。目前轻量级事务管理器只支持SQL 2005以及SQL2005以上的版本持久化资源。    
    2:内核事务管理器:在Vista被引入,并后续于Windows Server 2008,WIN7。引入内核事务管理器主要是把文件管理(NTFS文件系统)和注册表管理纳入事务范畴。我们将那些支持事务的文件系统和注册表叫作事务型文件系统(TxF)和事务型注册表(TxR)。 之所以称为内核事务管理器,是因它运行在内核模式上,而不是在用户模式上。同样内核事务管理器只支持一个持久化资源。    
    3:分布式事务协调器:每一台电脑上只有一个分布式事务协调器,它管理了当前计算机的所有事务资源。它可以跨程序域,跨进程,跨机器,跨网络来执行事务。当事务跨机器时,每台机器的分布式事务协调器按照相应的协议工作,实现对整个事务的管理,它对应的事务管理协议有Ole-Tx和WS-Atomic Transaction(WS-AT)这些。 分布式事务协调器能够管理一个分布式事务涉及的所有事务型资源,不管具体的事务型资源分布在何处。

    2.2,分布式事务

     理解分布式事务是怎样实现的,事务提交树是关键。

     事务提交树:事务提交树的根是事务初始化服务所在的机器的DTC,它在整个事务提交过程中充当着总协调者,又被称为全局提交协调器。资源管理器充当着事务提交树的叶子节点,它们的父结点为本机的DTC,分布于不同机器的DTC按照事务的传播路径形成了上下级关系。

    在一个分布式事务中,事务的初始化和提交是属于一个对象,只有最初开始的事务才能被提交,我们将这种能被初始化和提交的事务称作可提交事务。随着参与者逐个登记到事务中,它们本地的事务实际上依赖着这个最初开始的事务,所以我们称这种事务叫依赖事务。

    了解更多,请看博客:本地事务和分布式事务工作实践


    三、具体实现

    3.1,启动分布式事务服务

    启动微软的MSDTC分布式事务服务。用命令行启动或停止服务:


    3.2,具体应用

    <span style="font-family:KaiTi_GB2312;font-size:18px;">  public void RegisterUser(ITOO.AuthorityBack.ViewModel.OrganizationViewModel enSchool, FrontUserViewModel enUser, ITOO.Authority.ViewModel.OrganizationViewModel SchoolFront, UserViewModel UserFront, ITOO.Authority.ViewModel.RoleViewModel RoleFront, DataBaseViewModel db) 
            {
                Register(enSchool, db);
                using (TransactionScope trans = new TransactionScope())
                {
                    RegisterToBack(enSchool, enUser, db);//方法1
                    RegisterToFront(SchoolFront, UserFront, RoleFront, db);//方法2
                   <span style="color:#ff0000;"> trans.Complete();</span>
                }
            }</span>

    四、知识补充

    4.1,企业级服务COM+事务

    .NET Framework 依靠 MTS/COM+ 服务来支持自动事务处理。COM+ 使用 Microsoft Distributed Transaction Coordinator(DTC)作为事务管理器和事务协调器在分布式环境中运行事务。这样可使 .NET 应用程序运行跨多个资源结合不同操作(例如将定单插入SQL Server 数据库、将消息写入 Microsoft 消息队列(MSMQ)队列,以及从 Oracle 数据库检索数据)的事务。

    4.2,启动微软的msdtc的不稳定性

    虽然通过msdtc的服务可以解决多数据库服务器的事务处理,但是,它也会给系统带来很大的不稳定,不是必须如此,就尽量的避免它。给附带一个别的实现代码(通过改造本地事务而得,未经测试)

    <span style="font-family:KaiTi_GB2312;font-size:18px;">SqlConnection con1 = new ...........
    SqlConnection con2 = new ...........
    con1.Open();
    con2.Open();
    SqlTransaction trans1 = con1.BeginTransaction........
    SqlTransaction trans2 = con2.BeginTransaction........
    
    Command1 = new ......(con1,trans1);
    Command2 = new ......(con2,trans2);
    
    try
    {
         Command1.Exec......
         Command2.Exec......
         trans1.Commit();
         trans2.Commit();
    }
    catch
    {
             trans1.RollBack...
             trans2.RollBack...
    }
    finnaly
    {
      Close()
    }</span>

    五、总结

    虽然,启动了这个微软的服务,解决了不少的问题,但是,它随之而来的问题也是一个紧接着一个的,现在看来,那些问题,就是对于这个分布式事务处理的原理不清楚导致的。接下来,还会继续总结这个过程中所遇到的问题。


  • 相关阅读:
    [CF786B] Legacy
    [CF833B] The Bakery
    [JSOI2008] 最小生成树计数
    [SDOI2010] 外星千足虫
    [POJ1830] 开关问题
    [Luogu1365] WJMZBMR打osu! / Easy
    [Noip2016] 换教室
    [NOI2002] 荒岛野人
    [计蒜之道复赛 2018] 贝壳找房计数比赛
    [SDOI2014] 旅行
  • 原文地址:https://www.cnblogs.com/hhx626/p/6010379.html
Copyright © 2020-2023  润新知