Spring.Net實現跨數據庫服務層事務管理

在實際項目中用了Spring.Net框架以後,發現這框架在處理數據庫事務上特別強大,聲明式的數據庫事務解放了通常開發人員對數據庫事務操做的複雜處理。尤爲是多數據庫事務處理上,尤其顯得更簡便,幾個簡單的配置就能搞定。本篇文章對於如何用Spring.Net 2.0 + MVC 5.0搭建開發項目,就再也不多贅述。直接上關鍵事務配置文件的代碼: web

  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 都定義了數據事務. spring

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實例. api

在server層會去調用不一樣的dao對象去操做數據庫 app

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

正常的測試結果,是能夠往兩個數據庫不一樣表添加數據的。 框架

先來看異常測試,在代碼中拋出異常,以下圖所示 ide

 

調用webapi測試結果,如圖所示: 函數

查詢數據庫,發現 數據確實沒有添加成功 測試

如今去除代碼中的拋出異常代碼,再進行測試,返回了執行成功信息 spa

查看數據庫,表中,也發現,數據正常添加到了兩個表中。

說明,Spring.Net配置的兩個事務確實都已生效。 在實際測試中,我有去除代碼函數TestTransaction頭部的【Transaction】註解屬性,再在函數中最後拋出異常,測試結果是兩條數據都成功添加到了數據表中。

不得不說,Spring.Net的跨數據庫事務實現,確實太強大了. 只須要簡單的配置就能夠.

相關文章
相關標籤/搜索