Spring.Net实现跨数据库服务层事务管理
在实际项目中用了Spring.Net框架之后,发现这框架在处理数据库事务上特别强大,声明式的数据库事务解放了一般开发人员对数据库事务操作的复杂处理。尤其是多数据库事务处理上,尤为显得更简便,几个简单的配置就能搞定。本篇文章对于如何用Spring.Net 2.0 + MVC 5.0搭建开发项目,就不再多赘述。直接上关键事务配置文件的代码:
- <?xml version="1.0" encoding="utf-8" ?>
- <objects
xmlns="http://www.springframework.net"
xmlns:db="http://www.springframework.net/database"
xmlns:tx="http://www.springframework.net/tx"> - <description></description>
- <!--数据库提供者-->
- <db:provider
id="BaseDbProvider"
provider="System.Data.SqlClient"
connectionString="Data Source=YOOBABY-ZXRJ\ZXSOFT;User ID=sa;Password=123456;database=SYPT;"/> - <db:provider
id="BakDbProvider"
provider="System.Data.SqlClient"
connectionString="Data Source=YOOBABY-ZXRJ\ZXSOFT;User ID=sa;Password=123456;database=XNZH;"/> - <!--基础数据库 AdoTemplate访问上下文-->
- <object
id="BaseDb"
type="Spring.Data.Generic.AdoTemplate, Spring.Data"> - <property
name="DbProvider"
ref="BaseDbProvider"/> - <property
name="DataReaderWrapperType"
value="Spring.Data.Support.NullMappingDataReader, Spring.Data"/> - </object>
- <!--备份数据库 AdoTemplate访问上下文-->
- <object
id="BakDb"
type="Spring.Data.Generic.AdoTemplate, Spring.Data"> - <property
name="DbProvider"
ref="BakDbProvider"/> - <property
name="DataReaderWrapperType"
value="Spring.Data.Support.NullMappingDataReader, Spring.Data"/> - </object>
- <!--数据事务 ADO.NET Transaction Config-->
- <object
id="TransactionManager"
type="Spring.Data.Core.AdoPlatformTransactionManager, Spring.Data"> - <property
name="DbProvider"
ref="BaseDbProvider"/> - </object>
- <object
id="TransactionManager2"
type="Spring.Data.Core.AdoPlatformTransactionManager, Spring.Data"> - <property
name="DbProvider"
ref="BakDbProvider"/> - </object>
- <tx:attribute-driven
transaction-manager="TransactionManager"/> - <tx:attribute-driven
transaction-manager="TransactionManager2"/> - </objects>
如上数据事务配置文件中,定义了两个DbProvider , 两个AdoTempalate上下文,并正对两个DbProvider 都定义了数据事务.
dao层配置了相应代码:
- <!--数据操作 dao config -->
- <object
id="Dao.User"
type="HH.Application.Core.Dao.Impl.UserDao, HH.Application.Core"> - <property
name="AdoTemplate"
ref="BaseDb"/> - </object>
- <object
id="Dao.Role"
type="HH.Application.Core.Dao.Impl.RoleDao, HH.Application.Core"> - <property
name="AdoTemplate"
ref="BakDb"/> - </object>
UserDao的AdoTemplate属性注入的是BaseDb实例, RoleDao的AdoTemplate属性注入的是BakDb实例.
在server层会去调用不同的dao对象去操作数据库
- [Transaction]
- public
void TestTransaction() - {
- var model = new User();
- model.UserName = "xioliu";
- model.Password = "";
- model.OwnerCode = "";
- model.OwnerName = "";
- UserDao.Insert(model);
- Role rmodel = new Role();
- rmodel.RoleName = "测试员";
- rmodel.IsSys = 1;
- RoleDao.Insert(rmodel);
- }
正常的测试结果,是可以往两个数据库不同表添加数据的。
先来看异常测试,在代码中抛出异常,如下图所示

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

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

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

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

说明,Spring.Net配置的两个事务确实都已生效。 在实际测试中,我有去除代码函数TestTransaction头部的【Transaction】注解属性,再在函数中最后抛出异常,测试结果是两条数据都成功添加到了数据表中。
不得不说,Spring.Net的跨数据库事务实现,确实太强大了. 只需要简单的配置就可以.
Spring.Net实现跨数据库服务层事务管理的更多相关文章
- Spring+Mybatis+MySql+Maven 简单的事务管理案例
利用Maven来管理项目中的JAR包,同时使用Spring在业务处理层进行事务管理.数据库使用MySq,数据处理层使用Spring和Mybatis结合. 本案例代码主要结构如图: 1.数据库脚本 -- ...
- Spring整合JMS(四)——事务管理
原文链接:http://haohaoxuexi.iteye.com/blog/1983532 Spring提供了一个JmsTransactionManager用于对JMS ConnectionFact ...
- Spring整合JMS(四)——事务管理(转)
*注:别人那复制来的 Spring提供了一个JmsTransactionManager用于对JMS ConnectionFactory做事务管理.这将允许JMS应用利用Spring的事务管理特性.Jm ...
- spring事物配置,声明式事务管理和基于@Transactional注解的使用
http://blog.csdn.net/bao19901210/article/details/41724355 http://www.cnblogs.com/leiOOlei/p/3725911. ...
- Spring第13篇—–Spring整合Hibernate之声明式事务管理
不容置疑的我们可以知道Spring的事务管理是通过AOP(AOP把我们的事务管理织入到我们的业务逻辑里面了)的方式来实现的,因为事务方面的代码与spring的绑定并以一种样板式结构使用.(面向切面编程 ...
- Spring详解(七)------事务管理
PS:本篇博客源码下载链接:http://pan.baidu.com/s/1mi3NhX2 密码:3io2 1.事务介绍 事务(Transaction),一般是指要做的或所做的事情.在计算机术语中是指 ...
- Spring之旅第六篇-事务管理
一.什么是事务 什么是事务(Transaction)?事务是数据库中的概念,是指访问并可能更新数据库中各种数据项的一个程序执行单元(unit). 有个非常经典的转账问题:A向B转款1000元,A转出成 ...
- Spring详解(八)------事务管理
PS:本篇博客源码下载链接:http://pan.baidu.com/s/1mi3NhX2 密码:3io2 1.事务介绍 事务(Transaction),一般是指要做的或所做的事情.在计算机术语中是指 ...
- spring boot学习(6) SpringBoot 之事务管理
两个操作要么同时成功,要么同时失败: 事务的一致性: 以前学ssh ssm都有事务管理service层通过applicationContext.xml配置,所有service方法都加上事务操作: 用来 ...
随机推荐
- C++ 50学习 之提高对 C++的认识
转自Effective C++ 理解设计目标. 1.和 C 的兼容性. 2.效率. C++在效率上可以和 C 匹 敌 ---- 二者相差大约在 5%之内. 3.和传统开发工具及环境的兼容性. 4.解决 ...
- Echarts 柱状图属性详解
<script type="text/javascript"> // 基于准备好的dom,初始化echarts实例 var myChart = echarts.init ...
- springboot注解大全
springboot注解:@Service: 注解在类上,表示这是一个业务层bean@Controller:注解在类上,表示这是一个控制层bean@Repository: 注解在类上,表示这是一个数据 ...
- db2常见命令
增加db2top命令的refresh间隔,默认值为2秒,下面的命令就可以每10秒刷新一次: $ db2top -i 10 -d sample 数据库本身太繁忙(dynamic SQL过多).建议增加 ...
- Python学习—基础篇之文件操作
文件操作 文件操作也是编程中需要熟练掌握的技能,尤其是在后台接口编写和数据分析过程中,对各种类型的文件进行操作,获取文件信息或者对信息进行存储是十分重要的.本篇博客中将主要对常见的文本格式文件和Exc ...
- 命名空间 extern的用法 static全局变量
std是标准库中的命名空间: 关于extern的用法可以参考文献http://blog.163.com/sunjinxia%40126/blog/static/94984879201312145021 ...
- TZOJ 2099 Sightseeing tour(网络流判混合图欧拉回路)
描述 The city executive board in Lund wants to construct a sightseeing tour by bus in Lund, so that to ...
- node.js中实现http服务器与浏览器之间的内容缓存
一.缓存的作用 1.减少了数据传输,节约流量. 2.减少服务器压力,提高服务器性能. 3.加快客户端加载页面的速度. 二.缓存的分类 1.强制缓存,如果缓存有效,则不需要与服务器发生交互,直接使用缓存 ...
- Sql Server 三个很有用的函数
好久没有写有关SqlServer 数据库方面技术的文章了,正好今天遇到了一个问题,我就把这个当做一个练习记录下来.今天遇到一个麻烦事,详情如下:公司买了一个系统,在这个系统里面有一个“充值卡”的功能, ...
- Pandas 合并 concat
pandas处理多组数据的时候往往会要用到数据的合并处理,使用 concat是一种基本的合并方式.而且concat中有很多参数可以调整,合并成你想要的数据形式. 1.axis(合并方向):axis=0 ...