关于COM+提交数据时的事务问题。分不够可再开贴。

dailin 2003-07-28 07:04:32


做三层开了时遇到一个问题
做了两个COM+组件
A组件中有以下一段代码 ,事务为支持
procedure Tran(var ID,BookID: WideString);
begin
if (GetObjectContext.IsTransaction=True) then ShowMessage('Transaction Star!')
else ShowMessage('Transaction Not Star!');
try
//update A表
with AdoQuery1 do
begin
close;
sql.clear;
sql.add('update Person set BookID=BookID where ID=:ID');
Parameters.ParamByName('ID').values=ID;
Parameters.ParamByName('BookID').values:=BookID;
execsql;
end;
//update B表
with AdoQuery2 do
begin
close;
sql.clear;
sql.add('update Book set ID=ID where BookID=:BookID');
Parameters.ParamByName('ID').values=ID;
Parameters.ParamByName('BookID').values:=BookID;
execsql;
end;
setComplete;
except
on Exection do
SetAbort
end;
end;

B组件代码如下,事务为需要

procedure Updaet(var ID,BookID: WideString);
var
UpdateCom: imtsUpdate;
begin
updatecom:=comtsupdate.create;
updatecom.tran(ID,BookID);
end;

运行程序后,人为的给A表制造一点错误,让A表不能更新,然后执行更新操作,弹出对话框显示事务开始了,结果是A表数据没能更新,B表数据被更新了。为什么事务不能起到保护作用?
SQL Server的MSDTC也启动了的。


...全文
37 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
PhilexPei 2003-08-04
  • 打赏
  • 举报
回复
学习
eastliangliang 2003-08-03
  • 打赏
  • 举报
回复
事务类型改为需要。
另外,你的组件池化了吗?如果用了,参考下帖:
http://expert.csdn.net/Expert/topic/1600/1600678.xml?temp=.1018488
stella53 2003-07-30
  • 打赏
  • 举报
回复
在MTS/COM+里是不需要单独去管理事务的,因为事务已经由MTS/COM+来处理了,所以
SetComplete与SetAbort就是事务的提交与回滚,但由于Midas与MTS之间的一点问题,
所以请参看李维的ADO/MTS/COM+那本书就可以知道,需要修改Delphi的源码来使Midas
支持MTS/COM+的事务功能,那么SetComplete与SetAbort自然就有效了。。。

而且COM+组件事务需要严格对待
1、把数据的提取与更新操作分为两个COM+组件
2、数据提取COM+组件是不支持事务类型
3、数据更新COM+组件是支持事务类型,但事务需要动态创建
如此设计会使性能最优。
charlish 2003-07-30
  • 打赏
  • 举报
回复
你要自已加事务语句控制啊兄弟,你都没有进行事务控制你要它怎样帮你进行控制啊。
TRY
{你的语句}
SetComplete;
except
SetAbort;
end;
dailin 2003-07-30
  • 打赏
  • 举报
回复
stella53(慕蓉云风) 你好,可以给出一些简单的代码吗?
dailin 2003-07-29
  • 打赏
  • 举报
回复
大家帮帮忙吧。看了几天书,一点进展也没有。如果提交数据不能得到事务的保护,那么谁还敢用COM+呀。

1,593

社区成员

发帖
与我相关
我的任务
社区描述
Delphi 网络通信/分布式开发
社区管理员
  • 网络通信/分布式开发社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧