当前位置: 首页 > news >正文

spring.net 分布式事务 实现方式 多数据库并发访问下 服务层 事务管理 .net下事务管理...

首先要强调太强大了,微软虽然提供了scope来支持分布式事务,但是,只是对sql server支持的很好,system.data.oracleclient不支持分布式事务,今天有时间测试了下spring.net的多数据库同步事务,成功了,感谢spring.net,做的很好,现在将我的配置文件及server层代码copy如下:
1、配置文件
<?xml version="1.0" encoding="utf-8" ?>
<objects xmlns="http://www.springframework.net"
		 xmlns:aop = "http://www.springframework.net/aop"
		 xmlns:db="http://www.springframework.net/database"
	     xmlns:tx="http://www.springframework.net/tx">


	<!--spring.net的事务管理器  但是要用到spring.net自身dao实现-->
	<db:provider id="dbProvider"
			   provider="System.Data.SqlClient"
			   connectionString="server=192.168.1.82;database=HLJ_InfoManager;user id=sa;password=sa;Pooling=true;Min Pool Size=10;Max Pool Size=50;Connection Lifetime=30;Connection Timeout=30;"/>

	<!--spring.net访问oracle的配置方法 -->
	<db:provider id="dbProviderOracle"
				  provider="System.Data.OracleClient"
				  connectionString="Data Source=ORA99;User ID=pda;Password=pda;"/>
    
	
	<!--
		如果spring.net对其它数据库的支持不太好的话,可以考虑用odbc这种通用的数据库连接方式
    -->


	<!--adoTemplate-->
	<object id="adoTemplate" type="Spring.Data.Core.AdoTemplate, Spring.Data">
		<property name="DbProvider" ref="dbProvider"/>
		<property name="DataReaderWrapperType" value="Spring.Data.Support.NullMappingDataReader, Spring.Data"/>
	</object>

	<object id="adoTemplateOracle" type="Spring.Data.Core.AdoTemplate, Spring.Data">
		<property name="DbProvider" ref="dbProviderOracle"/>
		<property name="DataReaderWrapperType" value="Spring.Data.Support.NullMappingDataReader, Spring.Data"/>
	</object>


	<!--事务管理器-->
	<object id="transactionManager"
		   type="Spring.Data.Core.AdoPlatformTransactionManager, Spring.Data">
		   <property name="DbProvider" ref="dbProvider"/>
	</object>

	<object id="transactionManagerOracle"
		   type="Spring.Data.Core.AdoPlatformTransactionManager, Spring.Data">
		<property name="DbProvider" ref="dbProviderOracle"/>
	</object>
	
	
	<!--fun list-->
	<object id="IUserFun" type="com.gs.im.bl.system.impl.UserFunImpl, com.gs.im.bl">
		<property name="AdoTemplate" ref="adoTemplate"/>
		<property name="AdoTemplateOracle" ref="adoTemplateOracle"/>
	</object>

	<!--自定义驱动方式(根据方法的名字判断事务的类型)-->
	<tx:advice id="txAdvice" transaction-manager="transactionManager">
		<!-- the transactional semantics...-->
		<tx:attributes>
			<!-- all methods starting with 'get' are read-only -->
			<tx:method name="Get*" read-only="true"/>
			<!-- other methods use the default transaction settings (see below) -->
			<tx:method name="Do*"/>
		</tx:attributes>
	</tx:advice>

	<tx:advice id="txAdvice1" transaction-manager="transactionManagerOracle">
		<!-- the transactional semantics...-->
		<tx:attributes>
			<!-- all methods starting with 'get' are read-only -->
			<tx:method name="Get*" read-only="true"/>
			<!-- other methods use the default transaction settings (see below) -->
			<tx:method name="Do*"/>
		</tx:attributes>
	</tx:advice>


	<object id="serviceOperation" type="Spring.Aop.Support.SdkRegularExpressionMethodPointcut, Spring.Aop">
		<property name="pattern" value="com.gs.im.bl.*"/>
	</object>

	<aop:config>
		<aop:advisor pointcut-ref="serviceOperation" advice-ref="txAdvice"/>
		<aop:advisor pointcut-ref="serviceOperation" advice-ref="txAdvice1"/>
	</aop:config>
	
</objects>
2、server层代码的写法,本样是在server层配置的事务管理

         public void DoAdd()
        {
           Base_UsersDao base_UsersDao = this.GetDao<Base_UsersDao>();

            Base_Users user = new Base_Users
            {
                LogName = "张三",
                UserName = "张三疯"
            };
            // 向sqlserver 插入数据()
            this.AdoTemplate.ExecuteNonQuery(CommandType.Text, "insert into base_users (logname, username) values ('张三', '张三疯')");

	    //向oracle插入数据
            this.AdoTemplateOracle.ExecuteNonQuery(CommandType.Text, "insert into base_users (logname, username) values ('张三', '张三疯')");

            throw new ApplicationException("同时更新oracle跟sql server数据库spring.net的事务起不起作用呢?");
}

备注,实际中server层会去调用不同的dao对象去操作数据库的。

相关文章:

  • git常用操作教程
  • 开源2D游戏引擎(JavaAndroid),LGame-0.3.2版正式发布
  • Windows内存原理与内存管理
  • CruiseControl.NET : Email Publisher cc.net mail 配置(建议初学者必看)
  • 从 中文分词 展开的 胡思乱想
  • 敏捷开发,持续集成 CruiseControl.NET 自动发布 我的一点小实践 其中配置文件替换部分挺重要...
  • 续接上篇 cc.net 自动发布web应用程序 配置文件的替换
  • 敏捷开发,持续集成 fxcop 在 CruiseControl.NET中的使用
  • 前++和后++的实现
  • 函数的调用规则(__cdecl,__stdcall,__fastcall,__pascal)
  • __declspec关键字详细用法
  • 关于C#间接继承的一些思考:如何修改继承函数的返回值类型
  • 谈谈小弟最近暗自干些什么勾当(LGame WP版开发进度汇报)
  • VC++多线程编程
  • 恐怖绝伦,SOPA和PIPA捅了网站窝!
  • 【162天】黑马程序员27天视频学习笔记【Day02-上】
  • 【跃迁之路】【699天】程序员高效学习方法论探索系列(实验阶段456-2019.1.19)...
  • 从setTimeout-setInterval看JS线程
  • 从重复到重用
  • 对话 CTO〡听神策数据 CTO 曹犟描绘数据分析行业的无限可能
  • 可能是历史上最全的CC0版权可以免费商用的图片网站
  • 前端每日实战 2018 年 7 月份项目汇总(共 29 个项目)
  • 前嗅ForeSpider中数据浏览界面介绍
  • 前言-如何学习区块链
  • 入手阿里云新服务器的部署NODE
  • 问:在指定的JSON数据中(最外层是数组)根据指定条件拿到匹配到的结果
  • 详解移动APP与web APP的区别
  • python最赚钱的4个方向,你最心动的是哪个?
  • ​DB-Engines 11月数据库排名:PostgreSQL坐稳同期涨幅榜冠军宝座
  • ​香农与信息论三大定律
  • # Python csv、xlsx、json、二进制(MP3) 文件读写基本使用
  • #FPGA(基础知识)
  • (PHP)设置修改 Apache 文件根目录 (Document Root)(转帖)
  • (附源码)springboot猪场管理系统 毕业设计 160901
  • (一)插入排序
  • (轉貼) 2008 Altera 亞洲創新大賽 台灣學生成果傲視全球 [照片花絮] (SOC) (News)
  • . ./ bash dash source 这五种执行shell脚本方式 区别
  • .net 4.0 A potentially dangerous Request.Form value was detected from the client 的解决方案
  • .NET 实现 NTFS 文件系统的硬链接 mklink /J(Junction)
  • .NET 药厂业务系统 CPU爆高分析
  • .NetCore部署微服务(二)
  • .net下简单快捷的数值高低位切换
  • .set 数据导入matlab,设置变量导入选项 - MATLAB setvaropts - MathWorks 中国
  • @RequestMapping-占位符映射
  • [1]-基于图搜索的路径规划基础
  • [C#] 基于 yield 语句的迭代器逻辑懒执行
  • [C++11 多线程同步] --- 条件变量的那些坑【条件变量信号丢失和条件变量虚假唤醒(spurious wakeup)】
  • [FTP]pureftp部署和优化
  • [Java] IDEA Scala环境搭建
  • [java基础揉碎]关系运算符(比较运算符)逻辑运算符赋值运算符三元运算符运算符的优先级
  • [Linux]——彻底学通权限
  • [luoguP1666] 前缀单词(DP)
  • [NodeJS]NodeJS基于WebSocket的多用户点对点即时通讯聊天
  • [NOI2014]购票
  • [python] 之 函数简介