在实际项目中用了Spring.Net框架以后,发现这框架在处理数据库事务上特别强大,声明式的数据库事务解放了通常开发人员对数据库事务操做的复杂处理。尤为是多数据库事务处理上,尤其显得更简便,几个简单的配置就能搞定。本篇文章对于如何用Spring.Net 2.0 + MVC 5.0搭建开发项目,就再也不多赘述。直接上关键事务配置文件的代码: web
-
<?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 都定义了数据事务. spring
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实例. api
在server层会去调用不一样的dao对象去操做数据库 app
-
[Transaction]
-
public void TestTransaction()
-
{
-
var model = new User();
-
model.UserName = "xioliu";
-
model.Password = "55555";
-
model.OwnerCode = "10000";
-
model.OwnerName = "120";
-
UserDao.Insert(model);
-
-
Role rmodel = new Role();
-
rmodel.RoleName = "测试员";
-
rmodel.IsSys = 1;
-
RoleDao.Insert(rmodel);
-
}
正常的测试结果,是能够往两个数据库不一样表添加数据的。 框架
先来看异常测试,在代码中抛出异常,以下图所示 ide
调用webapi测试结果,如图所示: 函数
查询数据库,发现 数据确实没有添加成功 测试
如今去除代码中的抛出异常代码,再进行测试,返回了执行成功信息 spa
查看数据库,表中,也发现,数据正常添加到了两个表中。
说明,Spring.Net配置的两个事务确实都已生效。 在实际测试中,我有去除代码函数TestTransaction头部的【Transaction】注解属性,再在函数中最后抛出异常,测试结果是两条数据都成功添加到了数据表中。
不得不说,Spring.Net的跨数据库事务实现,确实太强大了. 只须要简单的配置就能够.