在分布式应用程序中,往往要同时操作多个数据库,使用数据库事务就不能满足业务的要求了。在COM+中,提供完整的事务处理服务。很方便处理多个数据库上的事务。
前提:
l 需要强名字;需要用RegSvcs2.0.exe,进行注册;需要开启相关的服务。
l 使用事务的对象需要继承ServicedComponent。
优势:
l 执行分布式事务,多个对象可以轻松地运行在同一个事务处理中,事务处理还可以自动登记。
l 获得COM+服务,诸如对象构建和对象池等。
缺点:
l 由于存在 DTC 和 COM 互操作性开销,导致性能降低。
l 使用Enterprise Services的事务总是线程安全的, 也就是说你无法让多个线程参与到同一个事务中。
下面来看下一段代码:
[Transaction(TransactionOption.Required)]
public class OrderBR : ServicedComponent
{
public OrderBR()
{
}
[AutoComplete]
public void AddAndDelete(_Tables t)
{
Thread thread = new Thread(new ThreadStart(delegate { AddDelete(t); }));
thread.Priority = ThreadPriority.Highest;
thread.Start();
}
public void AddDelete(_Tables t)
{
Warp warp = new Warp();
warp.Add(t);
Thread.Sleep(60000);
warp.Delete(t.name);
}
}
首先类必须继承ServicedComponent,属性值可为:Disabled,忽略当前上下文中的任何事务;NotSupported,使用非受控事务在上下文中创建组件;Required,如果事务存在则共享事务,并且如有必要则创建新事务;RequiresNew,使用新事务创建组件,而与当前上下文的状态无关;Supported,如果事务存在,则共享该事务。
方法属性值可声明为AutoComplete/[AutoComplete(false)]。
COM+事务有手动处理和自动处理两种方式,自动处理就是在所需要自动处理的方法前加上[AutoComplete],根据方法的正常或抛出异常决定提交或回滚。手动处理就是调用ContextUtil类中的EnableCommit、SetComplete和SetAbort方法。
本方法主要是先插入数据再通过线程间隔删除数据,在这个间隔时间里,可以尝试停止数据库服务,特意引发异常。当你重新启动数据库服务时,数据就会自动回滚。刚插入的数据虽然在SQL server Profiler 监控中是成功的.
下面是监控的截图:
好了,这次就介绍到这里。欢迎大家指正,及交流。源码下载地址:https://files.cnblogs.com/howzanh/Com_Demo.zip