【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 ...
随机推荐
- J2sdk中的主要的包介绍
- nginx缓存配置及开启gzip压缩
阅读目录 一:nginx缓存配置 二:nginx开启gzip 回到顶部 一:nginx缓存配置 在前一篇文章,我们理解过http缓存相关的知识点, 请看这篇文章. 今天我们来学习下使用nginx服务来 ...
- AJPFX浅谈Java新手问题之缺少良好的编程习惯
★随意地命名 有些新手写程序,当需要定义某个变量名(也可能是函数名.类名.包名等)时,随意地一敲键盘,名字就起好了......若干星期后,碰到某 bug,再来看自己写的代码时,心中暗自嘀咕:“这代码是 ...
- poj1190 生日蛋糕
题意: 要制作一个体积为Nπ的M层生日蛋糕,每层都是一个圆柱体. 设从下往上数第i(1 <= i <= M)层蛋糕是半径为Ri, 高度为Hi的圆柱.当i < M时,要求Ri > ...
- ssm框架搭建(下) 简单案例
前言 这段时间没有更新博客,一直想做一个基于ssm的简单的项目.经过多次的尝试,终于实现了简单的增删查改功能了. 正文 由于前端的技术不是很熟悉,经过多方的查阅,使用了bootstrap的样式,来使界 ...
- PHP中session和cookie的区别
这个话题无论是系统运维还是PHP开发人员面试时会经常遇到,所以这里也进行一些总结和归纳,session和cookie的具体理论网上比较大,大家googel下均可;系统运维注意区分下session(会话 ...
- docker 镜像管理操作
镜像特点 1. 分层存储的文件 2.一个软件运行环境 3.一个镜像可以创建多个容器 4.一种标准交付 5.不包含Linux内核而又精简的Linux操作系统 6.不是一个单一的文件而是由多层构成的,可以 ...
- JS将时间戳转换为刚刚、N分钟前、今天几点几分、昨天几点几分等表示法
使用Javascript语言,将时间戳转换为类似新浪微博的时间的表示方法. 要求转换规则: 1分钟以内显示为:刚刚 1小时以内显示为:N分钟前 当天以内显示为:今天 N点N分(如:今天 22:33) ...
- 用户交互和if条件判断、嵌套
#a=input("提示语“)#接受的数据类型是字符串str#提示用户输入姓名 # a=input("请输入姓名") print(a) '''输出结果:请输入姓名小明 姓 ...
- java分段加载数据,循环和递归两种方式
package org.jimmy.autosearch2019.test; import java.util.ArrayList; public class Test20190328 { priva ...