Spring.Net+WCF实现分布式事务

项目背景:ITOO.Teacher.Service提供一套访问教师数据库的WCF服务,ITOO.Student.Service提供一套访问学生数据库的WCF服务。学生服务端的B层在进行业务处理时,需要调用教师的WCF服务,我们需要在学生服务端的B层加上分布式事务处理,向教师库和学生库更新数据,要么都成功,要么都不成功。

1.在教师服务端,我们需要在WCF的接口上加上WCF分布式事务特性:

[OperationContract]
[TransactionFlow(TransactionFlowOption.Allowed)]
bool AddTeacher(TeacherViewModel vmTeacher);

在教师服务端的B层实现上加上WCF分布式事务特性:

        /// <summary>
        /// 增加学生
        /// </summary>
        /// <param name="vmTeacher">教师ViewModel</param>
        /// <returns>布尔值</returns>
         [OperationBehavior(TransactionScopeRequired = true, TransactionAutoComplete = true)]
        public bool AddTeacher(TeacherViewModel vmTeacher)
        {
            //创建转换规则
            Mapper.CreateMap<TeacherViewModel, TeacherEntity>();
            //转换实体
            TeacherEntity enStudent = Mapper.Map<TeacherEntity>(vmTeacher);
            //调用dal层增加方法
            this.CurrentDal.Add(enStudent);
            //提交事务,返回结果
            return this.DbSession.SaveChanges() > 0;
        }

2.在学生服务端的B层采用system.transactions进行分布式事务处理:

    public void AddStudentTeacher(StudentViewModel vmStudent)
        {
            //创建转换规则
            Mapper.CreateMap<StudentViewModel, StudentEntity>();
            //转换实体
            StudentEntity enStudent = Mapper.Map<StudentEntity>(vmStudent);

            //调用dal层增加方法
            this.CurrentDal.Add(enStudent);
            this.DbSession.SaveChanges();

            //调用老师的添加方法
            ITeacherContracts teacherContracts = ServiceFactory.GetTeacherService();

            TeacherViewModel vmTeacher = new TeacherViewModel { TeacherID = "123", TeacherName = "11" };
            teacherContracts.AddTeacher(vmTeacher);
        }

3.由于每个事务处理都需要using TransactionScope、 trans.Complete,所以我们用Spring.Net的AOP管理这些相同的处理:

 public class AroundAdvice : IMethodInterceptor
    {
        public object Invoke(IMethodInvocation invocation)
        {
            object result;
            using (TransactionScope trans = new TransactionScope())
            {
                result = invocation.Proceed();
                trans.Complete();
            }
            return result;
        }
    }

4.配置数据库服务器的MSDTC服务:

4.1开启MSDTC服务,在DOS中输入net start msdtc;

4.2设置MSDTC,在DOS中输入dcomcnfg.exe,按下图所示设置:

4.3关闭windows防火墙;

4.4开启数据库的分布式事务支持,设置如下图所示:

当前版本是用system.transactions实现的分布式事务,用Spring.Net的AOP切了一下,至于Spring.Net的声明式事务是否可以实现对WCF分布式事务的管理,这个还有待研究。

框架的源码下载地址:http://pan.baidu.com/s/1hqvOC6K (最好用VS2012打开)。

时间: 2024-11-04 17:04:36

Spring.Net+WCF实现分布式事务的相关文章

Spring事务隔离级别与传播机制,spring+mybatis+atomikos实现分布式事务管理

本文转载于本人另一博客[http://blog.csdn.net/liaohaojian/article/details/68488150] 1.事务的定义:事务是指多个操作单元组成的合集,多个单元操作是整体不可分割的,要么都操作不成功,要么都成功.其必须遵循四个原则(ACID). 原子性(Atomicity):即事务是不可分割的最小工作单元,事务内的操作要么全做,要么全不做: 一致性(Consistency):在事务执行前数据库的数据处于正确的状态,而事务执行完成后数据库的数据还是应该处于正确

spring事务隔离级别、传播行为以及spring+mybatis+atomikos实现分布式事务管理

转载自:http://blog.csdn.net/liaohaojian/article/details/68488150 1.事务的定义:事务是指多个操作单元组成的合集,多个单元操作是整体不可分割的,要么都操作不成功,要么都成功.其必须遵循四个原则(ACID). 原子性(Atomicity):即事务是不可分割的最小工作单元,事务内的操作要么全做,要么全不做: 一致性(Consistency):在事务执行前数据库的数据处于正确的状态,而事务执行完成后数据库的数据还是应该处于正确的状态,即数据完整

Spring Cloud同步场景分布式事务怎样做?试试Seata

一.概述 在微服务架构下,虽然我们会尽量避免分布式事务,但是只要业务复杂的情况下这是一个绕不开的问题,如何保证业务数据一致性呢?本文主要介绍同步场景下使用Seata的AT模式来解决一致性问题. Seata是 阿里巴巴 开源的 一站式分布式事务解决方案 中间件,以 高效 并且对业务 0 侵入 的方式,解决 微服务 场景下面临的分布式事务问题 ? 二.Seata介绍 整体事务逻辑是基于 两阶段提交 的模型,核心概念包括以下3个角色: TM:事务的发起者.用来告诉 TC,全局事务的开始,提交,回滚.

WCF分布式开发步步为赢(12):WCF事务机制(Transaction)和分布式事务编程

今天我们继续学习WCF分布式开发步步为赢系列的12节:WCF事务机制(Transaction)和分布式事务编程.众所周知,应用系统开发过程中,事务是一个重要的概念.它是保证数据与服务可靠性的重要机制. 作为面向服务应用的开发平台,WCF也提供了对事物编程模型的支持..NET 2.0提供的System.Transactions类来开发事务应用程序.同样WCF也支持事务特性,WCF事务机制是什么,它与微软已有的技术如Microsoft 分布式事务协调器 (MSDTC)有何关系?与Enterpise

谈谈分布式事务之三: System.Transactions事务详解[上篇]

在.NET 1.x中,我们基本是通过ADO.NET实现对不同数据库访问的事务..NET 2.0为了带来了全新的事务编程模式,由于所有事务组件或者类型均定义在System.Transactions程序集中的System.Transactions命名空间下,我们直接称基于此的事务为System.Transactions事务.System.Transactions事务编程模型使我们可以显式(通过System.Transactions.Transaction)或者隐式(基于System.Transact

LCN分布式事务管理(一)

前言 好久没写东西了,9月份换了份工作,一上来就忙的要死.根本没时间学东西,好在新公司的新项目里面遇到了之前没遇到过的难题.那遇到难题就要想办法解决咯,一个请求,调用两个服务,同时操作更新两个数据库.这就带来事务不一致的问题了,分布式事务管理被强行拉出来了.导致原本两个springboot的单体项目,必须要协同管理起来.刚好微服务也接触过,小试牛刀咯. 框架介绍 LCN分布式事务框架其本身并不创建事务,而是基于对本地事务的协调从而达到事务一致性的效果 核心步骤 创建事务组是指在事务发起方开始执行

Spring分布式事务

[如何实现XA式.非XA式Spring分布式事务] [http://www.importnew.com/15812.html] 在JavaWorld大会上,来自SpringSource的David Syer跟大家分享了Spring应用的几种事务处理机制.读完此文,你可以了解可以用分布式事务做些什么.不能做什么以及如何.何时避免使用XA,何时必须使用.

spring+hibernate管理多个数据源(非分布式事务)

本文通过一个demo,介绍如何使用spring+hibernate管理多个数据源,注意,本文的事务管理并非之前博文介绍的分布式事务. 这个demo将使用两个事务管理器分别管理两个数据源.对于每一个独立的事务,只涉及一个数据源. demo功能:实现一个能依靠两个独立的事务管理器互不干涉的管理自己的数据源的web demo. demo将实现: 1.独立地控制两个不同的数据源的事务管理器. 测试方式:restful web api 使用工具: spring 4.1.1.RELEASE hibernat

Java事务处理全解析(八)——分布式事务入门例子(Spring+JTA+Atomikos+Hibernate+JMS)

在本系列先前的文章中,我们主要讲解了JDBC对本地事务的处理,本篇文章将讲到一个分布式事务的例子. 请通过以下方式下载github源代码: git clone https://github.com/davenkin/jta-atomikos-hibernate-activemq.git 本地事务和分布式事务的区别在于:本地事务只用于处理单一数据源事务(比如单个数据库),分布式事务可以处理多种异构的数据源,比如某个业务操作中同时包含了JDBC和JMS或者某个操作需要访问多个不同的数据库. Java