分布式事务的点滴
年前一个项目中涉及到了两个数据库,为了保证业务功能的完整性,数据一致性,最终选用分布式事务来实现。
分布式事务:.NET Framework中可以依靠MTS/COM+服务来支持自动事务操作。COM+使用DTC(Microsoft Distribution Transaction Coordinator)作为事务管理器和事务协调器在分布式环境中运行事务,这样就可以使.NET来跨越多个资源进行操作了用程序引用COM+的方式来控制不同数据库的事务。
步骤:
1.新建类项目,加入引用System.EnterpriseServices.dll
2.完成需要用到分布式事务的业务类。
其中,需using System.EnterpriseServices;
类必须继承ServicedComponent
Function前加 [AutoComplete]
用异常处理来结束事务,使其回滚.比如判断某个值为false时,throw new exception()来回滚事务
/// <summary>
/// 创建订单的业务组件
/// 建立一个订单需要一个分布式事务,
/// </summary>
[Transaction(System.EnterpriseServices.TransactionOption.Required)]
[ClassInterface(ClassInterfaceType.AutoDispatch)]
[ObjectPooling(MinPoolSize=4, MaxPoolSize=4)]
public class OrderInsert : ServicedComponent {
/// <summary>
/// 现场销售时
/// </summary>
/// <param name="order"></param>
/// <returns></returns>
[AutoComplete]
public int InsertDirectSale(OrderInfo order)
{
// 判断操作过程中是否发生错误
if (rdr.GetInt32(0) != 0)
throw new Exception("插入订单时出现数据完整性异常 - 回滚 ISSUED");
}
}
3.需要注意的是使用COM+组件的Dotnet项目必须为强命名类型,因此完成下列步骤
1)用SN.exe工具生成一个相对于当前项目的文件,如Order.snk
打开SDK Command Prompt或者VS2003/vs2005中的Visual Studio 2005 Command Prompt.而不是windows的cmd ,进入项目的obj\Debug\,输入sn -k Order.snk,得到snk文件,然后必须要对Assembly设置一些必须的属性以确保它能够被正确的注册为COM+服务。
对项目里的AssemblyInfo.cs文件作如下修改,其中,AssemblyKeyFile里的路径是对应刚才生成的snk文件保存在项目的位置 (..\..\表示在项目根目录)。
using System.Reflection;
using System.Runtime.CompilerServices;
using System.EnterpriseServices;
[assembly: AssemblyVersion("1.0.0.1")]
[assembly: AssemblyDelaySign(false)]
[assembly: AssemblyKeyFile(@"..\..\Order.snk")]
[assembly: ApplicationName("HQ3 Shop")]
[assembly: ApplicationAccessControl(false, Authentication=AuthenticationOption.None)]
再次编译项目,如果通过,就说明生成成功。
4.在业务功能类完成,项目编译成功后,我们的工作只完成了一半。下面布署分布式事务环境。
在发布网站后,必须在Visual Studio 2005 Command Prompt下用regsvcs Order.dll将DLL组建注册为COM+服务,这样才能进行分布式事务的正常使用。
很重要的一点,如果你的类里有引用了其它一些DLL,那么这些DLL也必须是强命名,必须用gacutil.exe:全局程序集缓存工具加到全局程序集缓存中。否则Order.dlL将注册不成功。
5.在使用分布式事务时如果不做一些配置,很可能会出现各种各样的错误。下面引用http://www.x2blog.cn/jinhong618/?tid=12688下的文章,文章中讲述了几种出错情况及处理方法。
作为补充,提供一个工具来测试使分布事环境中的所有机器是否联通(必须以机器名PING通才说明机器连通)。
下载MS提供的DTCPing.exe 分装在两台机上,按README说明来运行它.看出错信息.
http://download.microsoft.com/download/complus/msdtc/1.7/nt45/en-us/DTCPing.exe
请参考以下文章:
http://www.x2blog.cn/jinhong618/?tid=12688
http://www.cnblogs.com/finejob/archive/2007/09/17/895671.html
http://www.cnblogs.com/sadier/archive/2004/12/15/77452.html
http://www.builder.com.cn/2007/1002/533285.shtml