Translation DataModule接口中提供这样一个方法供客户端调用:
procedure Tmtsdm1.InsertTest;
var
  SqlStr: string;
begin
  SqlStr := 'INSERT INTO Unit(Unit) VALUES (' + #39 + '个' + #39 + ')';
  try
    acPHYMIS.Execute(SqlStr);
    raise Exception.Create('Error occured');
    SetComplete;
  except
    SetAbort;
    raise;
  end;
end;
意在测试com+的事务处理能否正确执行。
将组件安装后,在组件服务中该com+组件的属性设置中将“激活”页的“启用对象池”选项选中,执行客户端程序调用上面这个方法,发现com+的事务机制不能正确执行,数据会写入数据库中。如果不选中“启用对象池”,则一切正常,数据并不会写到数据库中。
说明:Translation DataModule的设置,事务属性:requires a transaction,允许object pooling,pooled设为true,无论将AutoComplete设为True或False都会出现上述情况。
该问题最先由ytwxw (wxw) 提出,至今尚未有结论,我也发现类似问题。我俩探讨后无法解决,特在此再开一贴。请各路com+高手帮忙解答!

解决方案 »

  1.   


    moto 愚钝~~在什么情况下"启用对象池"选项可选?
    以前的测试没有选它~~~
      

  2.   

    :)
    摩托,说点实际的。不用setcomplete,用acPHYMIS.commitetrans不知怎么样?说实话,还不知道用setcomplete时,哪里声明事务的开始。
      

  3.   

    a new error:标记没有引用存储
      

  4.   

    苹果,你怎么不上qq~~~摩托等你ing
      

  5.   

    引用存储是多线程引起的,go on~
      

  6.   

    我这里有类似的问题(Oracle数据库8.1.7.0.0)
    正在研究文章:
    http://support.microsoft.com/default.aspx?scid=/support/complus/mtsandoracle.asp
      

  7.   

    Sorry,这个URL用不了,用下面的URL吧。
    http://www.microsoft.com/china/msdn/library/techart/complus_best.asp
      

  8.   

    WangPeter(Peter) oracle 下 我测试的更惨你的具体情况是什么?在oracle下,com+的事务控制根本就不起作用!
      

  9.   

    根据这篇文章,Oracle数据库必须先升级到8.1.7.1.5,周六加班升级,折腾了一下午,升级失败。只好今天继续战斗。升级后还要做很多设置,烦!烦!烦!
      

  10.   

    For Windows 2000
    To ensure that COM+ components work with Oracle, follow these steps: 1、Install Windows 2000.
      
    2、Install Oracle Client 8.1.7 with patch 8.1.7.1.5. Please contact Oracle for information on how to install the latest patch.
      
    3、Install Oracle Net8 with the latest patches.4、Install Microsoft Data Access Components (MDAC) 2.6 Service Pack 1 (SP1) or later.
      
    5、Update the client software registry keys. (See "Update Oracle Client Software Registry Keys" later in this document.)同志们,努力吧!
      

  11.   

    我的mdac 是2.7啊 是delphi7 带的.
    你要是搞定了 记的告诉我一声啊
      

  12.   

    苹果今天试了试,没发现不回滚啊,倒是第二次执行时说:错误:分布式事务已完成,请将此会话等记到新事务或NULL事务中。debug时发现没有执行setcomplete,可是李维分明说缺省是enablecommit啊。
    不明白。
      

  13.   

    苹果的问题我也遇到过,看来com+和midas结合的问题不少
      

  14.   

    去掉setcomplete和raise,写入数据库,说明缺省是提交的,李维说得没错。
    加上setcomplete和raise之后,抛出异常,没写进数据库,莫不是异常时缺省回滚。没发现不回滚。
    笑天兄,你的那个“错误:分布式事务已完成,请将此会话等记到新事务或NULL事务中。”的错误怎么解决的,池化原因?池化时要注意什么啊?
      

  15.   

    苹果,你的translation datamodule中的ADOConnection的Connect属性是否并未显式设置,而是在客户端调用时由其自动连接或关闭,我在这种情况下就测出了“错误:分布式事务已完成,请将此会话等记到新事务或NULL事务中。”的问题。
      后来,我在mts rdm的OnCreate事件中将Connect:=True后不会出现这个错误,但是又出现了如本贴所说的错误。
      你试一下如何?
      

  16.   

    哈哈 
    原来是这样啊
    我也是在oncreate的时候建立的数据库连接笑天:
    在客户端调用时由其自动连接或关闭的情况下,数据能够正常回滚,你是这个意思吧?
      

  17.   


    在oracle下
    如果由客户端调用时由其自动连接或关闭的情况下就会出现cannot connect to the trasaction manager or the transaction manager is unavailable的问题?我想可能是要用com+的事务控制的话,必须由其自动连接或关闭你们认为呢?
      

  18.   

    ytwxw(wxw) :是如此;
    但只要第二次存取数据就会出问题,想再开一个客户端都不行,……
      

  19.   

    我在《com+技术大全》这本书看到这样的话:“MTS表面上有一组文档中给出的方法来支持对象池,然而,这些方法在MTS的运行环境中是不能实现的。你的确可以在MTS中实现对象池,但这需要编写一个资源分配器,而在大多数情况下,这在com+却是不需要的。”
    如果是这样子的话,那么是否Translation Datamodule是基于mts的,因而并不能真正支持对象池的功能?
      

  20.   

    maybe 吧 
    可是如果我们不实现池化的话 ,有怎样保证系统服务大量用户呢?
      

  21.   

    苹果试了一下午,未解决,不过用ADO的事务处理可以解决。
    ADOConnection.BeginTrans
    ADOConnection.CommitTrans
    ADOConnection.RollbackTrans不过我总觉得应该有解的,COM+已经出现两年多了,应该比较成熟了。
      

  22.   

    可是adoconnection的事务不能跨组件吧?
      

  23.   

    用一个接口封装所有ADO的操作,所有对数据库的操作都由这个接口来实现。
    这也是我的那个方案的思想,不过没测试过效率,这可能是瓶颈,不过改数据库时会有好处,业务逻辑层不用动。楼上的兄弟们在论坛上泡了一天了吧,真羡慕。我这里刚刚解禁:)
      

  24.   

    用ado的事务处理是没问题了,不过好象有些不伦不类呀是否delphi6和delphi7匆匆推出,关于translation datamodule,borland未做好足够的测试呀
      

  25.   

    我在《com+技术大全》这本书看到这样的话:“MTS表面上有一组文档中给出的方法来支持对象池,然而,这些方法在MTS的运行环境中是不能实现的。你的确可以在MTS中实现对象池,但这需要编写一个资源分配器,而在大多数情况下,这在com+却是不需要的。”
    如果是这样子的话,那么是否Translation Datamodule是基于mts的,因而并不能真正支持对象池的功能?
      

  26.   

    我的意思是如果我的一个事务是由多个组件的方法共同完成的话用ado做事务处理 能够保证全部都rollback吗?
      

  27.   

    苹果 
    我试了你的方案如果能控制好ado的事务,也可以。这样的话,所有数据连接都只能内建在一个rdm中,对这个rdm实现object pooling 对不对?
      

  28.   

    我今天发现用ADO做事务有不方便的地方,COM+的事务处理确实有它独到的地方,比如是用投票制,只有根函数才真正结束事务。
    今天想了想,如果要用ADO事务,需要多加一个层来模拟客户端,根据各个函数的返回值来决定是否提交事务,好像有些不方便。不知我说的是否太模糊。
    能用COM+的事务还是用的好。
    下午公司开联欢会,得走了,大家元旦快乐。
      

  29.   

    小小的bbs:
    http://www.nxit.net/bbs
      

  30.   

    我也发现了这个问题
    如果要用面向足见的开发方式,用ado的事务控制根本就是不切实际的
    我们不可能把所有的逻辑都封装到一个rdm中
      

  31.   

    在com+环境下开发,不用com+的事务处理,真是有些举步难艰呀
      

  32.   

    TOMWLD(笑天) 
    有同感 我在试着将所有的5全都封装到一个rdm中呢,可是如果这样的话,com+的延展性又从喝7谈起呢?急啊高手们有没有解决办法啊 ?
      

  33.   

    我在《com+技术大全》这本书看到这样的话:“MTS表面上有一组文档中给出的方法来支持对象池,然而,这些方法在MTS的运行环境中是不能实现的。你的确可以在MTS中实现对象池,但这需要编写一个资源分配器,而在大多数情况下,这在com+却是不需要的。”
    如果是这样子的话,那么是否Translation Datamodule是基于mts的,因而并不能真正支持对象池的功能?
    哪位方家验证过这个问题?