各位大侠,我曾看过李维写的一些关于事务支持的文章,但还是不太清楚.在此我举个简单例子,希望高手不惜赐教!非常感谢!
例:
有A,B,C,D四个组件对象,假设每个对象内部都涉及数据库更新操作.
调用关系是这样的:A调用B和C,而B又调用D
A
|\
B C
|
D现在我客户端调用A执行数据更新,所有数据更新需要在一个事务内完成,即任何组件的数据更新出错都应该取消所有数据更新操作.问:如何设置各自的线程模型和事务模型,才能保证正确调用呢?Object Pooling对此有影响吗?各个组件的过程代码是这样写的吗?
procedure A; //其余类似
begin
  try
    {code}
    SetCompleted;
  except
    SetAbort;
  end;
end;

解决方案 »

  1.   

    1、在代码正确的前提下,线程模型和对象池对事务没有影响。
    2、线程模型最好一致,这样执行效率会较高。
    3、启动事务的那个组件(A组件)要设置为需要事务或者需要新事务,被其启动的事务被称为根事务
    4、被根事务组件创建(一定要用ObjectContext.CreateInstance方法)的对象,如果支持事务,即自动继承该事务,得到一个子事务环境。所以B、C、D至少要支持事务,或者可以设置为需要事务,但不能是需要新事务。
    5、在同一个事物上下文中,任何一个环节的子事务或者根事务调用SetAbort都将导致整个事务撤销,而不管其他事务是否投票赞成提交(SetComplete)。你的代码是正确的。但注意一定要在根组件中用ObjectContext.CreateInstance方法创建其他子对象,而不能用CoXXX.Create来创建COM对象。否则事务无法传播,自然也提不上协作。我写一个ezService(http://www.ezService.org),主要就是解决这个问题的,在CSDN已经注册了(http://www.csdn.net/cnshare/soft/18/18634.shtm),你可以看看,对你有帮助。简要介绍:
    1.  使用ezService开发分布式数据库应用,可以大幅度简化应用服务器的开发,无须在建立COM+/SOAP  Server应用上花费任何时间,也不需要费心管理数据库事务,只要具备熟练运用SQL的能力,理解SQL参数匹配规则即可写出复杂的分布式应用服务,使得入门级程序员也可以轻松负担服务开发任务。
    2.  ezService高级服务允许按照类pascal语法规则自由书写脚本,实现复杂业务逻辑,新版本可以支持自Borland  Delphi  7导出的大量函数和对象。同时提供了对COM的直接支持,可以通过引用COM组件,与外部系统进行复杂的交互操作。
    3.  ezService内核为COM+,支持连接池(connection  pooling)和对象池(object  pooling)机制,自动支持分布式事务。
    4.  ezService使用ADO提供程序连接数据库管理系统,凡是提供良好的OLE-DB驱动的DBMS均可支持(目前已经在SQL  Server和Oracle  8/9上通过用户验证)。
    5.  ezService使用名为ESDL(ezService定义语言)的(类似WSDL)XML发布文档,ESDL可以对外界发布ezService所开发服务的全部功能接口,使得第三方开发者也可以方便的了解服务,快速进行二次开发而无需了解服务细节。
    6.  支持SOAP协议,提供一个ISAPI类型的Web  Service,一个ASP.NET  Web  Service,可以直接将服务功能发布到Internet/Intranet,无须额外编程。
    7.  未授权的ezService服务具备与授权版本完全相同的功能,仅会在执行时随机锁定3个用户身份验证帐号,其他功能不受影响。
    8.  由于使用了COM+/SOAP技术,ezService可以被主流开发工具轻松调用,发行版本附带了可应用于Borland  Delphi  7的一组VCL,使开发员可以迅速访问ezService服务。在Visual  Studio  .NET开发环境中也可以轻松使用类似技术。
      

  2.   

    小弟初学多层,适逢高手指点,实乃甚喜甚辛!
    再请教大侠一个问题:
    http://expert.csdn.net/Expert/topic/2227/2227764.xml?temp=.4643518