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

一、问题概述

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>

五、总结

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

【ITOO 4】WCF中,分布式事务处理的更多相关文章

  1. 跟我一起学WCF(10)——WCF中事务处理

    一.引言 好久没更新,总感觉自己欠了什么一样的,所以今天迫不及待地来更新了,因为后面还有好几个系列准备些,还有很多东西需要学习总结的.今天就来介绍下WCF对事务的支持. 二.WCF事务详解 2.1 事 ...

  2. WCF中事务处理

    一.引言 今天来介绍下WCF对事务的支持. 二.WCF事务详解 2.1 事务概念与属性 首先,大家在学习数据库的时候就已经接触到事务这个概念了.所谓事务,它是一个操作序列,这些操作要么都执行,要么都不 ...

  3. WCF学习之旅—WCF中传统的异常处理(十六)

    WCF中的异常处理 在软件开发过程中,不可能没有异常的出现,所以在开发过程中,对不可预知的异常进行解决时,异常处理显得尤为重要.对于一般的.NET系统来说,我们简单地借助try/catch可以很容易地 ...

  4. .NET分布式事务处理

    在进行数据持久化的时候,我们会经常用到事务处理.一般情况下,ADO.NET中的事务处理就能够满足我们的需要,但是,ADO.NET中的事 务不能同事对多个数据库连接进行原子性的操作:如果在你的业务环境中 ...

  5. 跟我一起学WCF(12)——WCF中Rest服务入门

    一.引言 要将Rest与.NET Framework 3.0配合使用,还需要构建基础架构的一些部件.在.NET Framework 3.5中,WCF在System.ServiceModel.Web组件 ...

  6. 跟我一起学WCF(8)——WCF中Session、实例管理详解

    一.引言 由前面几篇博文我们知道,WCF是微软基于SOA建立的一套在分布式环境中各个相对独立的应用进行交流(Communication)的框架,它实现了最新的基于WS-*规范.按照SOA的原则,相对独 ...

  7. .NET分布式事务处理总结【下】 - 包含MSMQ的分布式事务处理

    转自:http://www.cnblogs.com/daxnet/archive/2011/03/15/1984995.html .NET直接提供对MSMQ的访问支持,只需要添加System.Mess ...

  8. SQL点滴9—SQL Server中的事务处理以及SSIS中的内建事务

    原文:SQL点滴9-SQL Server中的事务处理以及SSIS中的内建事务 我们可以把SSIS中的整个package包含在一个事务中,但是如果在package的执行过程中有一个表需要锁定应该怎么处理 ...

  9. .NET分布式事务处理(转)

    出处:http://www.cnblogs.com/youring2/archive/2011/06/12/MSDTC.html 在进行数据持久化的时候,我们会经常用到事务处理.一般情况下,ADO.N ...

随机推荐

  1. oracle中的用户详解 【转】

      oracle中的用户很多,也很令初学者费解.oracle中的帐户分为两类:一类是必需的帐户,一类是存储各种应用的帐户 用户名 密码 描述 ANONYMOUS ANONYMOUS 访问http的匿名 ...

  2. pyinstaller 打包.exe文件记录遇到的问题

    用pyinstaller打包py2.7的程序有时会出现不匹配的错误,在python的idle下运行没有问题,打包之后却会报一些错误,所以打包的话还是尽量用py3.5版本,而且用 -F 将程序打包成一个 ...

  3. Apache Kylin的架构特性

    不多说,直接上干货! http://kylin.apache.org/cn/ 可扩展的超快OLAP引擎,提供标准SQL查询接口 支持单机或集群部署,为减少在Hadoop上百亿规模数据查询延迟而设计: ...

  4. Windows下Apache应用环境塔建安全设置(目录权限设置)

    目的:为Apache,php配置受限制的用户权限.保护系统安全.需要的朋友可以参考下. 环境配置情况: apache安装目录:d:\www-s\apache php目录:d:\www-s\php5 m ...

  5. 正确使用MySQL JDBC setFetchSize()方法解决JDBC处理大结果

    一直很纠结,Oracle的快速返回机制,虽然结果集很多,可是它能很快的显示第一个结果,虽然通过MYSQl的客户端可以做到,但是通过JDBC却不行. 今天用了1个多小时,终于搞定此问题,希望对广大Jav ...

  6. SQL系列学习 存储过程&事物语法

    /*学习事物基本语法*/ /*增加课室名的唯一索引*/ ALTER table class add constraint uni_ClassName unique(name) /*创建存储过程,其中增 ...

  7. qt5 上传图片到http服务器

    转载请注明出处:http://www.cnblogs.com/dachen408/p/8185060.html qt5 上传图片到http服务器,亲测可以用,qt5.8+vs2015,直接上码; 头文 ...

  8. vue路由高级语法糖

    1.当 <router-link> 对应的路由匹配成功,将自动设置 class 属性值 .router-link-active. 模板中可以用{{$route.params.xxx取到路由 ...

  9. Android(java)学习笔记167:横竖屏切换时Activity的生命周期

    1.横竖屏切换的生命周期     默认情况下横竖屏切换,先销毁再创建 2.有的时候,默认情况下的横竖屏切换(先销毁再创建),对应用户体验是不好的,比如是手机游戏横竖屏切换对游戏体验非常不好,下面两种方 ...

  10. unix网络编程-配置unp.h头文件

    第一步进入:www.unpbook.com,下载unp的随书代码.新建一个目录,将压缩包拷贝到这一目录下面,然后将压缩包直接解压:tar -zxvf  压缩包名.tar.gz 完成上一步后,进入到un ...