在实际项目中用了Spring.Net框架之后,发现这框架在处理数据库事务上特别强大,声明式的数据库事务解放了一般开发人员对数据库事务操作的复杂处理。尤其是多数据库事务处理上,尤为显得更简便,几个简单的配置就能搞定。本篇文章对于如何用Spring.Net 2.0 + MVC 5.0搭建开发项目,就不再多赘述。直接上关键事务配置文件的代码:

  1. <?xml version="1.0" encoding="utf-8" ?>
  2. <objects
    xmlns="http://www.springframework.net"
    xmlns:db="http://www.springframework.net/database"
    xmlns:tx="http://www.springframework.net/tx">
  3.   <description></description>
  4.   <!--数据库提供者-->
  5.   <db:provider
    id="BaseDbProvider"
    provider="System.Data.SqlClient"
    connectionString="Data Source=YOOBABY-ZXRJ\ZXSOFT;User ID=sa;Password=123456;database=SYPT;"/>
  6.   <db:provider
    id="BakDbProvider"
    provider="System.Data.SqlClient"
    connectionString="Data Source=YOOBABY-ZXRJ\ZXSOFT;User ID=sa;Password=123456;database=XNZH;"/>
  7.  
  8.  
  9.   <!--基础数据库 AdoTemplate访问上下文-->
  10.   <object
    id="BaseDb"
    type="Spring.Data.Generic.AdoTemplate, Spring.Data">
  11.     <property
    name="DbProvider"
    ref="BaseDbProvider"/>
  12.     <property
    name="DataReaderWrapperType"
    value="Spring.Data.Support.NullMappingDataReader, Spring.Data"/>
  13.   </object>
  14.  
  15.   <!--备份数据库 AdoTemplate访问上下文-->
  16.   <object
    id="BakDb"
    type="Spring.Data.Generic.AdoTemplate, Spring.Data">
  17.     <property
    name="DbProvider"
    ref="BakDbProvider"/>
  18.     <property
    name="DataReaderWrapperType"
    value="Spring.Data.Support.NullMappingDataReader, Spring.Data"/>
  19.   </object>
  20.  
  21.   <!--数据事务 ADO.NET Transaction Config-->
  22.   <object
    id="TransactionManager"
    type="Spring.Data.Core.AdoPlatformTransactionManager, Spring.Data">
  23.     <property
    name="DbProvider"
    ref="BaseDbProvider"/>
  24.   </object>
  25.  
  26.   <object
    id="TransactionManager2"
    type="Spring.Data.Core.AdoPlatformTransactionManager, Spring.Data">
  27.     <property
    name="DbProvider"
    ref="BakDbProvider"/>
  28.   </object>
  29.  
  30.   <tx:attribute-driven
    transaction-manager="TransactionManager"/>
  31.   <tx:attribute-driven
    transaction-manager="TransactionManager2"/>
  32. </objects>

如上数据事务配置文件中,定义了两个DbProvider , 两个AdoTempalate上下文,并正对两个DbProvider 都定义了数据事务.

dao层配置了相应代码:

  1. <!--数据操作 dao config -->
  2. <object
    id="Dao.User"
    type="HH.Application.Core.Dao.Impl.UserDao, HH.Application.Core">
  3.   <property
    name="AdoTemplate"
    ref="BaseDb"/>
  4. </object>
  5.  
  6. <object
    id="Dao.Role"
    type="HH.Application.Core.Dao.Impl.RoleDao, HH.Application.Core">
  7.   <property
    name="AdoTemplate"
    ref="BakDb"/>
  8. </object>

UserDao的AdoTemplate属性注入的是BaseDb实例, RoleDao的AdoTemplate属性注入的是BakDb实例.

在server层会去调用不同的dao对象去操作数据库

  1. [Transaction]
  2. public
    void TestTransaction()
  3. {
  4.     var model = new User();
  5.     model.UserName = "xioliu";
  6.     model.Password = "";
  7.     model.OwnerCode = "";
  8.     model.OwnerName = "";
  9.     UserDao.Insert(model);
  10.  
  11.     Role rmodel = new Role();
  12.     rmodel.RoleName = "测试员";
  13.     rmodel.IsSys = 1;
  14.     RoleDao.Insert(rmodel);
  15. }

正常的测试结果,是可以往两个数据库不同表添加数据的。

先来看异常测试,在代码中抛出异常,如下图所示

 

调用webapi测试结果,如图所示:

查询数据库,发现 数据确实没有添加成功

现在去除代码中的抛出异常代码,再进行测试,返回了执行成功信息

查看数据库,表中,也发现,数据正常添加到了两个表中。

说明,Spring.Net配置的两个事务确实都已生效。 在实际测试中,我有去除代码函数TestTransaction头部的【Transaction】注解属性,再在函数中最后抛出异常,测试结果是两条数据都成功添加到了数据表中。

不得不说,Spring.Net的跨数据库事务实现,确实太强大了. 只需要简单的配置就可以.

Spring.Net实现跨数据库服务层事务管理的更多相关文章

  1. Spring+Mybatis+MySql+Maven 简单的事务管理案例

    利用Maven来管理项目中的JAR包,同时使用Spring在业务处理层进行事务管理.数据库使用MySq,数据处理层使用Spring和Mybatis结合. 本案例代码主要结构如图: 1.数据库脚本 -- ...

  2. Spring整合JMS(四)——事务管理

    原文链接:http://haohaoxuexi.iteye.com/blog/1983532 Spring提供了一个JmsTransactionManager用于对JMS ConnectionFact ...

  3. Spring整合JMS(四)——事务管理(转)

    *注:别人那复制来的 Spring提供了一个JmsTransactionManager用于对JMS ConnectionFactory做事务管理.这将允许JMS应用利用Spring的事务管理特性.Jm ...

  4. spring事物配置,声明式事务管理和基于@Transactional注解的使用

    http://blog.csdn.net/bao19901210/article/details/41724355 http://www.cnblogs.com/leiOOlei/p/3725911. ...

  5. Spring第13篇—–Spring整合Hibernate之声明式事务管理

    不容置疑的我们可以知道Spring的事务管理是通过AOP(AOP把我们的事务管理织入到我们的业务逻辑里面了)的方式来实现的,因为事务方面的代码与spring的绑定并以一种样板式结构使用.(面向切面编程 ...

  6. Spring详解(七)------事务管理

    PS:本篇博客源码下载链接:http://pan.baidu.com/s/1mi3NhX2 密码:3io2 1.事务介绍 事务(Transaction),一般是指要做的或所做的事情.在计算机术语中是指 ...

  7. Spring之旅第六篇-事务管理

    一.什么是事务 什么是事务(Transaction)?事务是数据库中的概念,是指访问并可能更新数据库中各种数据项的一个程序执行单元(unit). 有个非常经典的转账问题:A向B转款1000元,A转出成 ...

  8. Spring详解(八)------事务管理

    PS:本篇博客源码下载链接:http://pan.baidu.com/s/1mi3NhX2 密码:3io2 1.事务介绍 事务(Transaction),一般是指要做的或所做的事情.在计算机术语中是指 ...

  9. spring boot学习(6) SpringBoot 之事务管理

    两个操作要么同时成功,要么同时失败: 事务的一致性: 以前学ssh ssm都有事务管理service层通过applicationContext.xml配置,所有service方法都加上事务操作: 用来 ...

随机推荐

  1. (转)PWA(Progressive Web App)渐进式Web应用程序

    PWA 编辑 讨论 PWA(Progressive Web App)是一种理念,使用多种技术来增强web app的功能,可以让网站的体验变得更好,能够模拟一些原生功能,比如通知推送.在移动端利用标准化 ...

  2. canvas绘制气泡

    思路:使用Math.random()函数绘制是个不同位置,大小,颜色的圆形,然后设置定时器,前一个状态用一个与画布相同颜色的背景图片进行覆盖,改变圆形的位置,每次改变都是在这张空白的背景图片上面重新进 ...

  3. Linux shell 信号继承

    shell中,向进程发送信号多多通过ctrl键加上一些功能键来实现,这里是常见的Ctrl组合键及其意义: 组合键 信号类型 意义 Ctrl+C INT信号,即interrupt信号 停止运行当前的作业 ...

  4. Mysql连接数太多ERROR 1040 (HY000): Too many connections

    数据库连接报错:ERROR 1040 (HY000): Too many connections   1.查看连接数 /usr/local/mysql/bin/mysqladmin -h host - ...

  5. TaskScheduler

    一初始化 在SparkContext初始化的时候,同时初始化三个对象.DAGScheduler,TaskScheduler,SchedulerBackend.DAGScheduler,前面已经讲到,做 ...

  6. 42 【docker】run命令

    最常用的两个option是,网络端口映射,和文件共享 最基本的启动命令(从image创建一个container并启动):docker run -d <image-name> -d:表示守护 ...

  7. Linux 里的 2>&1含义

    我们在Linux下经常会碰到nohup command>/dev/null 2>&1 &这样形式的命令.首先我们把这条命令大概分解下: 首先就是一个nohup:表示当前用户 ...

  8. 动态添加 SqlParameter 参数

    List<SqlParameter> paras = new List<SqlParameter>(); paras.Add(new SqlParameter("@m ...

  9. Git常用命令及场景

    Git命令推送到远程分支 1.登录GitHub创建一个远程仓库. https://github.com 2.git init 本地创建一个目录,并初始化一个git仓库. 3.git add 添加文件到 ...

  10. CentOS 6.7快速搭建lamp环境

    安装前要关闭防火墙,防止外网不能访问,这一点很重要,要不然外网访问不了: ①关闭防火墙:service iptables stop ②永久关闭防火墙:chkconfig iptables off ③查 ...