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

一、问题概述

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. RedHat7.2安装matplotlib——之Python.h:没有那个文件或目录

    按理说运行下面一句就可以安装了 pip install matplotlib 但是对于我的redhat7.2+python2.7.5,报了下面的错误 _posixsubprocess.c:3:20: ...

  2. Android里的 ART、JIT、AOT、Dalvik之间有什么关系?

    ART.JIT.AOT.Dalvik之间有什么关系? JIT与Dalvik JIT是"Just In Time Compiler"的缩写,就是"即时编译技术", ...

  3. FileZilla Server 端设置passive模式注意事项

    1,需求和问题的产生 实践中需要分布在各地的各个客户端向云端服务器上传文件,因此在阿里云服务器上安装了FileZilla Server软件作为文件FTP服务端. 客户端程序采用FTP方式向服务端传输文 ...

  4. TFS2010单独安装配置tfs build server

    记录一下确实很磨人. 同样硬件和软件环境的两台服务器,其中一台服务器很久之前就配置好了tfs2010 build ,然后最近想再配置一台tfs build server,但是按照以前的配置流程始终提示 ...

  5. 正确使用MySQL JDBC setFetchSize()方法解决JDBC处理大结果集 java.lang.OutOfMemoryError: Java heap space

    昨天在项目中需要对日志的查询结果进行导出功能. 日志导出功能的实现是这样的,输入查询条件,然后对查询结果进行导出.由于日志数据量比较大.多的时候,有上亿条记录. 之前的解决方案都是多次查询,然后使用l ...

  6. js递归和数组去重(简单便捷的用法)

    1.递归例子<script type="text/javascript"> function test(num) { if(num < 0) { return; ...

  7. python * urllib_urlopen( )

    python * urllib_urlopen( ) Python urllib 库提供了一个从指定的 URL 地址获取网页数据,然后对其进行分析处理,获取想要的数据. 一.urllib模块urlop ...

  8. 解决异常System.Runtime.Interopservices.COMException RequestLock问题

    工具——导入导出设置,重置调试设置就可以了,这是调试文件的异常

  9. leetcode_935. Knight Dialer_动态规划_矩阵快速幂

    https://leetcode.com/problems/knight-dialer/ 在如下图的拨号键盘上,初始在键盘中任意位置,按照国际象棋中骑士(中国象棋中马)的走法走N-1步,能拨出多少种不 ...

  10. Python 中列表、元祖、字典

    1.元祖: 对象有序排列,通过索引读取读取, 对象不可变,可以是数字.字符串.列表.字典.其他元祖 2.列表: 对象有序排列,通过索引读取读取, 对象是可变的,可以是数字.字符串.元祖.其他列表.字典 ...