一路向前..

天下事有难易乎?为之,则难者亦易矣;不为,则易者亦难矣。

  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

在分布式应用程序中,往往要同时操作多个数据库,使用数据库事务就不能满足业务的要求了。在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

posted on 2011-01-23 22:01  一路->向前  阅读(976)  评论(0编辑  收藏  举报