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+高手帮忙解答!
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+高手帮忙解答!
解决方案 »
- 关于使用TInifile用什么函数写入INI文件的注释?
- 老问题: 关于权限的比较简单的问题?
- 关于3721的问题
- 高手请进!
- 关于ComboBox控件的问题
- 基于DCOM三层结构(delphi+oracle)生产管理系统源程序
- procedure tform1.b(var a:tedit);//procedure tform1.b( a:tedit);看不出加了VAR和不加VAR有什么区别
- WordApplication 在connect时总是出现“呼叫请求被对方拒绝”,为什么?
- 急!请问怎样才能如此连接ORACLE数据库?一定给分!!!
- update 问题?急!!!
- Delphi?
- DBGRID中如何动态控制某列是否显示???
moto 愚钝~~在什么情况下"启用对象池"选项可选?
以前的测试没有选它~~~
摩托,说点实际的。不用setcomplete,用acPHYMIS.commitetrans不知怎么样?说实话,还不知道用setcomplete时,哪里声明事务的开始。
正在研究文章:
http://support.microsoft.com/default.aspx?scid=/support/complus/mtsandoracle.asp
http://www.microsoft.com/china/msdn/library/techart/complus_best.asp
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.)同志们,努力吧!
你要是搞定了 记的告诉我一声啊
不明白。
加上setcomplete和raise之后,抛出异常,没写进数据库,莫不是异常时缺省回滚。没发现不回滚。
笑天兄,你的那个“错误:分布式事务已完成,请将此会话等记到新事务或NULL事务中。”的错误怎么解决的,池化原因?池化时要注意什么啊?
后来,我在mts rdm的OnCreate事件中将Connect:=True后不会出现这个错误,但是又出现了如本贴所说的错误。
你试一下如何?
原来是这样啊
我也是在oncreate的时候建立的数据库连接笑天:
在客户端调用时由其自动连接或关闭的情况下,数据能够正常回滚,你是这个意思吧?
在oracle下
如果由客户端调用时由其自动连接或关闭的情况下就会出现cannot connect to the trasaction manager or the transaction manager is unavailable的问题?我想可能是要用com+的事务控制的话,必须由其自动连接或关闭你们认为呢?
但只要第二次存取数据就会出问题,想再开一个客户端都不行,……
如果是这样子的话,那么是否Translation Datamodule是基于mts的,因而并不能真正支持对象池的功能?
可是如果我们不实现池化的话 ,有怎样保证系统服务大量用户呢?
ADOConnection.BeginTrans
ADOConnection.CommitTrans
ADOConnection.RollbackTrans不过我总觉得应该有解的,COM+已经出现两年多了,应该比较成熟了。
这也是我的那个方案的思想,不过没测试过效率,这可能是瓶颈,不过改数据库时会有好处,业务逻辑层不用动。楼上的兄弟们在论坛上泡了一天了吧,真羡慕。我这里刚刚解禁:)
如果是这样子的话,那么是否Translation Datamodule是基于mts的,因而并不能真正支持对象池的功能?
我试了你的方案如果能控制好ado的事务,也可以。这样的话,所有数据连接都只能内建在一个rdm中,对这个rdm实现object pooling 对不对?
今天想了想,如果要用ADO事务,需要多加一个层来模拟客户端,根据各个函数的返回值来决定是否提交事务,好像有些不方便。不知我说的是否太模糊。
能用COM+的事务还是用的好。
下午公司开联欢会,得走了,大家元旦快乐。
http://www.nxit.net/bbs
如果要用面向足见的开发方式,用ado的事务控制根本就是不切实际的
我们不可能把所有的逻辑都封装到一个rdm中
有同感 我在试着将所有的5全都封装到一个rdm中呢,可是如果这样的话,com+的延展性又从喝7谈起呢?急啊高手们有没有解决办法啊 ?
如果是这样子的话,那么是否Translation Datamodule是基于mts的,因而并不能真正支持对象池的功能?
哪位方家验证过这个问题?