WCF分布式事务(EF)
才说分布式事务,首先,了解一下什么是交易。
事务有四个特性:ACID
A是Atomicity,原子性。一个事务往往涉及到很多的子操作,原子性则保证这些子操作要么都做,要么都不做,而不至于出现事务的部分操作成功,而另外一部分操作没有成功。假设事务在运行的过程中错误发生,那么数据库将回滚到事务发生之前的状态。比方银行的转账服务。这个事务的终于结果一定是:某个账户的剩余金额添加了x,而另外一个账户的剩余金额降低了x,或者两个账户的剩余金额未发生变化。而不会出现其它情况。
C是Consistency。一致性。一致性是指事务发生前后。都不会破坏数据库的约束关系,保证了数据库元素的正确性、有效性和完整性。
这样的约束关系能够是数据库内部的约束。比方数据库元素的值必须在一定的范围内,也能够是应用带来的约束,比方转账以后银行账户的剩余金额不能为负数。
I是Isolation。隔离性。一个事务的操作在未提交曾经,是不会被并行发生的其它事务訪问到的。
也就是说。数据库操作不会看到某个事务的中间操作结果。比方转账过程中。用户是不能查询到一个账户剩余金额降低了,而另外一个账户剩余金额未发生变化的情况。
D是Durability。持久性。事务完毕以后。它对数据库的影响是永久性的,即使在数据库系统发生宕机或者其它故障的情况下,这样的影响也会得到保持。
简单的来说事务,事务是运行的最小单元。
比方运行的sql语句:delete from Table where FiledsA='a'
这一条sql语句就是一个 事务单元。即最小的运行颗粒。
假设运行两条sql语句:
insert into Table values('1','zc')
insert into Table values('1','zc')— 与第一条主键冲突
运行如上,包括两个运行单元。这两个运行单元所有运行成功。才算完毕任务,则这两个运行单元组成了一个新的事务。
正是由于有这样的情况出现,才引出了事务的概念。
对于上述的表述,两个运行单元都在同一个数据库server。即在 同一个数据库中操作两次。
那么,假设两个运行单元。分别在不同的数据库呢?
比方说,跨行转账的样例。从银行A转账到银行B。这一个完整的操作,须要各自更改的数据库。
即。银行A中账户剩余金额降低,银行B中账户剩余金额添加。
对于这样的不再同一个数据库server上的 操作。假设要把这两个运行单元。当成一个事务进行处理。
则须要引入分布式事务的概念。
分布式事务:为了解决不同数据库server、分布式系统间的事务问题。
一下是一个实例,如今有两个服务:
服务A:对数据库A进行增删改的操作
服务B:对数据库B进行增删改的操作
如今主要说一下。WCF是怎样支持分布式事务的。
WCF 集合了差点儿由.NET Framework 所提供的通信方法。
EF中的SaveChanges方法,封装了本地事务。
即:运行SaveChanges方法,才会将对实体的更改更新到数据库。
既然要把WCF中的服务做成 支持分布式的形式。所以就要选择一个WCF的通信绑定协议。
这样client与服务端的通信才干够形成事务。
WCF中的绑定协议:
watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvemM0NzQyMzU5MTg=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast" alt="">
当中WsHttpBinding协议,在MSDN上的解释:
当然WCF中也能够使用<CustomeBinding>协议。这是一个自己定义的绑定协议。有兴趣的能够查一下。
分布式事务实现流程图:
没有分布式事务的情况下。如图:
watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvemM0NzQyMzU5MTg=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast" alt="">
带红框的是一个事务颗粒。可是依据业务要求。WcfService1和WcfService2须要合并成一个事务。所以须要加上分布式事务。
使用分布式事务的情况,如图:
分布式事务的配置:
服务端webconfig:
<system.serviceModel>
<bindings>
<wsHttpBinding> <!--使用WsHttpbinding协议-->
<!--启动事务流-->
<binding name="WsHttpBinding_Default" transactionFlow="true" />
</wsHttpBinding>
</bindings>
<behaviors>
<serviceBehaviors>
<behavior name="Basic">
<serviceMetadata httpGetEnabled="True"/>
<serviceDebug includeExceptionDetailInFaults="true" />
</behavior>
</serviceBehaviors>
</behaviors>
<services>
<!--service的name是服务端的实现类-->
<service name="BasicService.BasicService" behaviorConfiguration="Basic">
<endpoint address ="" binding="wsHttpBinding" bindingConfiguration="WsHttpBinding_Default" contract="BasicContracts.IBasicService" /><!--contract是服务端的契约(接口) 命名空间+类名-->
</service>
</services>
<serviceHostingEnvironment aspNetCompatibilityEnabled="true" multipleSiteBindingsEnabled="true" minFreeMemoryPercentageToActivateService="1" />
</system.serviceModel>
clientwebconfig:
<system.serviceModel>
<bindings>
<wsHttpBinding>
<binding name="WsHttpBinding_Default" transactionFlow="true" />
</wsHttpBinding> </bindings>
<behaviors>
<serviceBehaviors>
<behavior name="">
<serviceMetadata httpGetEnabled="true" />
<serviceDebug includeExceptionDetailInFaults="true" />
</behavior>
</serviceBehaviors>
</behaviors>
<serviceHostingEnvironment multipleSiteBindingsEnabled="true" /> <client>
<!--考试服务终结点-->
<endpoint address="http://192.168.24.146:8111/ExamService.svc?wsdl"
binding="wsHttpBinding" bindingConfiguration="WsHttpBinding_Default"
contract="ExamContracts.IExamService"
name="WsHttpBinding_Services" />
<!--基础服务终结点-->
<endpoint address="http://192.168.24.146:8222/BasicService.svc?wsdl"
binding="wsHttpBinding" bindingConfiguration="WsHttpBinding_Default"
contract="BasicContracts.IBasicService"
name="WsHttpBinding_Services" />
</client> </system.serviceModel>
以上是client与server端的配置文件。
对于服务端的方法。假设要求 server端的某个方法。自己能够被其它的事务包括。则须要对这样的方法上面加上一个特性。
//契约类(接口)特性
[ServiceContract(SessionMode = SessionMode.Required)]
public partial interface IBasic
{
[OperationContract]
[TransactionFlow(TransactionFlowOption.Allowed)]
void AddBasic(T_Student en);
} //实现类特性
public partial class BasicService:IBasic
{
[OperationBehavior(TransactionScopeRequired = true, TransactionAutoComplete = true)]
public void AddBasic(T_Student en)
{
DBBasic dbContext = new DBBasic(); T_Student enTemp = new T_Student(); enTemp.StudentId = en.StudentId;
enTemp.Sex = en.Sex;
enTemp.College = en.College;
enTemp.Age = en.Age; dbContext.T_Student.Add(enTemp);
dbContext.SaveChanges(); //真正的保存到数据库
}
}
在契约类上面的特性,TransactionFlowOption有多个属性能够选择。
TransactionFlowAttribute 仅仅能用于服务方法(Operation/Method)上,它同意我们进行不同的事务參与设置。有一点要注意,我们不能为 IsOneWay=true 的服务设置事务支持。
TransactionFlowOption.NotAllowed: 不參与不论什么事务。(默认值)
TransactionFlowOption.Allowed:
同意參与事务。也就是说,假设调用方(client)和服务Binding启用了事务,则參与。
TransactionFlowOption.Mandatory: 强制启用事务。调用方(client)和服务 Binding 必须启用事务才干调用本服务。
client,在组合
两个 事务的时候,须要:
using (TransactionScope trans = new TransactionScope())
{
//获取考试服务
IExam examService = ExamServiceFactory.GetExam();
//获取基础服务
IBasic basicService = BasicServiceFactory.GetStudent(); //加入考试(正确)
T_Exam enExam = new T_Exam();
enExam.ExamId = "1";
enExam.ExamRoom = "501";
enExam.StudentId = "11040342031";
examService.addExam(enExam); ////加入基础(正确)
//T_Student enStudent = new T_Student();
//enStudent.StudentId = "11040342031";
//enStudent.Age = "22";
//enStudent.College = "师范学院";
//enStudent.Sex = "男";
//basicService.AddBasic(enStudent); //提交
trans.Complete();
}
这两个
分别具有事务性质的颗粒,通过以上就能够组合成一个新的事务。
使用Wshttpbinding通讯方式之后,WCF中的方法
就能够被其它的事务包进去。
事务,就是由一个个小颗粒组成。事务,也能够由若干个事务组成。
分布式事务。也就是整合一些分别在不同机器上的事务。除了给其它服务提供的事务
加个 特性之外。其它的也都和传统事务同样了。
Demo下载链接:http://download.csdn.net/detail/zc474235918/8505775
版权声明:本文博客原创文章。博客,未经同意,不得转载。
WCF分布式事务(EF)的更多相关文章
- WCF分布式事务
原文地址:http://developer.51cto.com/art/201002/185426.htm 我们作为一个开发人员,应该能够顺应技术的不断发展,不断的去掌握新技术.那么,对于WCF的掌握 ...
- [转载]WCF系列_分布式事务(下)
浏览到chnking的WCF的分布式事务处理不错,转载过来分享一下. 1. WCF分布式事务例子这里也用转账的例子说事.用户在系统A和系统B都有账户,账户间的资金可以互转,系统A的资金减少多少,系统B ...
- EF架构~关系表插入应该写在事务里,但不应该是分布式事务
回到目录 这个标题很有意思,关系表插入,就是说主表和外表键在插入时,可能会有同步插的情况,如在建立主表时,扩展表需要同步完成数据的初始化工作,而对于多表插入时,我们为了保证数据的一致性会针它写在事务中 ...
- WCF(三)分布式事务
最近在学WCF,所以有两个设想疑问(菜鸟多疑问): 如果有WCF服务A,WCF服务B,客户端调用WCF服务A插入一条数据,然后再调用服务B也插入一条数据,然而服务B出错了进行了回滚,服务A能不能也进行 ...
- EF 事务(非分布式事务)
在EF 中怎么使用事务? 这个问题纠结了我好久,直到有人跟我一起讨论,我和同事一起讨论查资料. 查的好多资料都是使用 TransactionScope,用 TransactionScope 可处理分布 ...
- WCF分布式开发步步为赢(12):WCF事务机制(Transaction)和分布式事务编程
今天我们继续学习WCF分布式开发步步为赢系列的12节:WCF事务机制(Transaction)和分布式事务编程.众所周知,应用系统开发过程中,事务是一个重要的概念.它是保证数据与服务可靠性的重要机制. ...
- DDD~领域事件中使用分布式事务
回到目录 对于一个聚合来说,它可能会被附加很多事件,这里我们叫它领域事务,因为一个聚会我们可以把它理解成一个领域,一个业务.对于领域事件不清楚的同学可以看看我的这篇文章<DDD~领域事件与事件总 ...
- WCF分布式开发步步为赢(9):WCF服务实例激活类型编程与开发
.Net Remoting的激活方式也有三种:SingleTon模式.SingleCall模式.客户端激活方式,WCF服务实例激活类型包括三种方式:单调服务(Call Service),会话服务(Se ...
- 【WCF--初入江湖】07 分布式事务
07 分布式事务 一.前言 [1]理解事务特性 [2]掌握TransactionFlow 特性 [3]掌握WCF中的事务属性 TransactionAutoCompleteOnSessionClose ...
随机推荐
- SSM框架理解(转)
SSM框架理解 最近两星期一直在学JavaEE的MVC框架,因为之前学校开的JavaEE课程就一直学的吊儿郎当的,所以现在真正需要掌握就非常手忙脚乱,在此记录下这段时间学习的感悟,如有错误,希望大牛毫 ...
- Codeforces 191 C Fools and Roads (树链拆分)
主题链接~~> 做题情绪:做了HDU 5044后就感觉非常easy了. 解题思路: 先树链剖分一下,把树剖分成链,由于最后全是询问,so~能够线性操作.经过树链剖分后,就会形成很多链,可是每条边 ...
- POJ 2536 Gopher II(二分图的最大匹配)
题目链接:http://poj.org/problem?id=2536 题意:已知有n仅仅老鼠的坐标,m个洞的坐标,老鼠的移动速度为V,S秒以后有一仅仅老鹰要吃老鼠,问有多少个老鼠被吃. 非常明晰,二 ...
- Very Deep Convolutional Networks for Large-Scale Image Recognition
Very Deep Convolutional Networks for Large-Scale Image Recognition 转载请注明:http://blog.csdn.net/stdcou ...
- swift学习一:介绍,开发文档下载
在今天wwdc2014公布会上.苹果今天公布了全新的编程语言Swift以及新版Xcode.对于开发人员来说,Swift包括了非常多开发人员喜欢的功能,能够与Objective-C和C语言共同工作.Sw ...
- Swift正在使用NSURLConnection异步下载同步(实例解析)
原版的blog.转载请注明出处 http://blog.csdn.net/hello_hwc 一.同步异步两个概念 简单来讲.同步就是函数或者闭包(objective c中的block)运行完成才干返 ...
- linux、hdfs、hive、hbase经常使用的命令
linux经常使用命令 pwd 查看当前工作文件夹的绝对路径 cat input.txt 查看input.txt文件的内容 ls 显示当前文件夹下全部的文件及子文件夹 rm recommender-d ...
- 【Nginx】开发一个简单的HTTP模块
首先来分析一下HTTP模块是怎样介入Nginx的. 当master进程fork出若干个workr子进程后,每一个worker子进程都会在自己的for死循环中不断调用事件模块: for ( ;; ) { ...
- 复制360于Launcher浮动窗口的屏幕显示内存使用情况(基本版)
MainActivity如下面: package cc.cc; import android.os.Bundle; import android.view.View; import android.v ...
- C# WinForm多线程(一)Thread类库
Windows是一个多任务的系统,如果你使用的是windows 2000及其以上版本,你可以通过任务管理器查看当前系统运行的程序和进程.什么是进程呢?当一个程序开始运行时,它就是一个进程,进程所指包括 ...