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

本文介绍使用Spring.NET实现跨SQL Server与Oracle数据库的事务管理配置与应用实践,包括配置文件示例与服务层代码实现。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

      首先要强调太强大了,微软虽然提供了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对象去操作数据库的。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值