【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>
五、总结
虽然,启动了这个微软的服务,解决了不少的问题,但是,它随之而来的问题也是一个紧接着一个的,现在看来,那些问题,就是对于这个分布式事务处理的原理不清楚导致的。接下来,还会继续总结这个过程中所遇到的问题。
【ITOO 4】WCF中,分布式事务处理的更多相关文章
- 跟我一起学WCF(10)——WCF中事务处理
一.引言 好久没更新,总感觉自己欠了什么一样的,所以今天迫不及待地来更新了,因为后面还有好几个系列准备些,还有很多东西需要学习总结的.今天就来介绍下WCF对事务的支持. 二.WCF事务详解 2.1 事 ...
- WCF中事务处理
一.引言 今天来介绍下WCF对事务的支持. 二.WCF事务详解 2.1 事务概念与属性 首先,大家在学习数据库的时候就已经接触到事务这个概念了.所谓事务,它是一个操作序列,这些操作要么都执行,要么都不 ...
- WCF学习之旅—WCF中传统的异常处理(十六)
WCF中的异常处理 在软件开发过程中,不可能没有异常的出现,所以在开发过程中,对不可预知的异常进行解决时,异常处理显得尤为重要.对于一般的.NET系统来说,我们简单地借助try/catch可以很容易地 ...
- .NET分布式事务处理
在进行数据持久化的时候,我们会经常用到事务处理.一般情况下,ADO.NET中的事务处理就能够满足我们的需要,但是,ADO.NET中的事 务不能同事对多个数据库连接进行原子性的操作:如果在你的业务环境中 ...
- 跟我一起学WCF(12)——WCF中Rest服务入门
一.引言 要将Rest与.NET Framework 3.0配合使用,还需要构建基础架构的一些部件.在.NET Framework 3.5中,WCF在System.ServiceModel.Web组件 ...
- 跟我一起学WCF(8)——WCF中Session、实例管理详解
一.引言 由前面几篇博文我们知道,WCF是微软基于SOA建立的一套在分布式环境中各个相对独立的应用进行交流(Communication)的框架,它实现了最新的基于WS-*规范.按照SOA的原则,相对独 ...
- .NET分布式事务处理总结【下】 - 包含MSMQ的分布式事务处理
转自:http://www.cnblogs.com/daxnet/archive/2011/03/15/1984995.html .NET直接提供对MSMQ的访问支持,只需要添加System.Mess ...
- SQL点滴9—SQL Server中的事务处理以及SSIS中的内建事务
原文:SQL点滴9-SQL Server中的事务处理以及SSIS中的内建事务 我们可以把SSIS中的整个package包含在一个事务中,但是如果在package的执行过程中有一个表需要锁定应该怎么处理 ...
- .NET分布式事务处理(转)
出处:http://www.cnblogs.com/youring2/archive/2011/06/12/MSDTC.html 在进行数据持久化的时候,我们会经常用到事务处理.一般情况下,ADO.N ...
随机推荐
- Python: How to iterate list in reverse order
#1 for index, val in enumerate(reversed(list)): print len(list) - index - 1, val #2 def reverse_enum ...
- RHEL 6.5----LVS(DR)
主机名 IP 所需软件 master eth0==>192.168.30.140(Nat) eth0:1==>192.168.17.130(Nat) ipvsadm node-1 et ...
- window上安装MySQL
一.安装MySQL 1.1 下载解压缩版的安装包,解压,然后配置环境变量 PATH=.......;D:\Program Files (x86)\mysql-5.5.27-win32\bin (注意是 ...
- C#基础学习4
流程控制!
- P2345 奶牛集会andP2657 低头一族
做法是一样的 题目背景 MooFest, Open 题目描述 约翰的N 头奶牛每年都会参加“哞哞大会”.哞哞大会是奶牛界的盛事.集会上的活动很 多,比如堆干草,跨栅栏,摸牛仔的屁股等等.它们参加活动时 ...
- html5新增的主题结构元素
article元素 article元素代表文档.页面或应用程序中独立的.完整的.可以独自被外部引用的内容. 它可以是一篇博客或者报刊中的文章,一篇论坛帖子.一段用户评论或独立的插件. 或其他任何独立的 ...
- Redis学习笔记(四)集合进阶
1.组合与关联多个集合 差集: SDIFF key1 [key2...](返回存在于key1但不存在其他集合中的元素) SDIFFSTORE destination key1 [key2...](将存 ...
- jmeter的JVM参数设置
JMeter用户可根据运行的计算机配置,来适当调整JMeter.bat中的JVM调优设置,如下所示: set HEAP=-Xms512m -Xmx512m set NEW=-XX:NewSize=12 ...
- 微信小程序开发系列一:微信小程序的申请和开发环境的搭建
我最近也刚刚开始微信小程序的开发,想把我自学的一些心得写出来分享给大家. 这是第一篇,从零开始学习微信小程序开发.主要是小程序的注册和开发环境的搭建. 首先我们要在下列网址申请一个属于自己的微信小程序 ...
- powerDesigner 一些设置
常用设置 table中需要显示的内容 --------------------------------------------------------------------------------- ...