在中间件中如何进行事务处理(100分)

  • 主题发起人 主题发起人 shsshashssha
  • 开始时间 开始时间
S

shsshashssha

Unregistered / Unconfirmed
GUEST, unregistred user!
在应用服务器中,如何进行数据的回滚,请说明您在哪个函数中实现的.
 
try
database1.starttransaction;
//启动事务
storedproc1.execproc;
storedproc2.parambyname('@...').As...:=......;
.........;
storedproc2.ExecProc;
//存储过程2 写真正的数据保存入库
database1.commit;
//确认事务
except
database1.rollback;

/*如果最后一次操作失败,则数据库回滚,返回*/
IF @@ERROR<>0 begin
select @result=1
select @message='数据库有错误!'
rollback transaction myxxxxx
return
END
 
前天跟公司的几个人探讨了一下,得到以下建议:
对于数据完整性的事务建议封装到存储过程中,也就是在存储过程中调用数据库服务器的
事务处理功能。
对于商业逻辑性的事务建议将对数据库的修改过程及事务全部写到程序代码中。
另:
我不太赞成房客的方法,既然调用存储过程只是为了实现一个事务,那为什么不把
事务放到存储过程中去呢?
 
to 房客:
1.你能解释storedproc1的用途吗?
2.启动事务,事务回滚应各在什么时机调用?(在哪个函数中调用)
3.列出一些多表更新的现象:
Applyupdate(-1)后无论是否修改成功,sql trace均显示commit,没有rollback,按李维
的观点,只要delta数据封包被detasetprovider接收,midas会启动一个事务.
to 小猪:
不太好理解,你能简单说一下算法吗?一个例子也行,谢谢!
 
最近做事物控制时,有一些想法,提出来和大家交流一下。
1.李维书上提到midas能自行控制事物。我注意到在这种情况下,clientdataset是连接到
相应的datasetprovider上;而且都调用了clientdataset的applyupdates方法,也就是说
客户在客户端修改数据后,改动数据由默认方式传到相应的datasetprovider上,系统调用
datasetprovider的as_applyupdates方法真正修改数据。
2.自行控制事物,都要直接通过连接控件的appserver(远程模块列表)查找相应远程方法。
手工数据包传入rdm后,应该启动一个新事物,然后由数据操纵控件组织sql叙述聚集/
更新数据,这时将事物提交/回滚。
 
原来的理解有偏差,
自行控制事物时只需要通过连接控件调用远程方法,与clientdataset的设置无关,
 
同意shsshashssha,需要创建远程的事务方法。
 
to shsshashssha:
>>按李维的观点,只要delta数据封包被detasetprovider接收,midas会启动一个事务.
我的问题好象就在与此,在两个(多个)Client端同时向AppServer提交的时候(指向同一个
Provider),在BeforeUpdateRecord事件中就会引发一个Ole Error----“无法在此会话中
启动更多的事物”,有办法解决么?
 
自己控制事物完成功能.
 
自己写远程方法,不用detasetprovider
 
to shsshashssha:
>>自己写远程方法,不用detasetprovider
但现在产品已经定型了,发现了这样的问题,难道要推翻重新做过吗?
另:我自己写一个测试的AppServer同时提交就不会产生这样的问题。
 
检查你的appserver的线程模型,Instance,如果还不行,请您找找已结束的贴子
 
>>我在代码里手动建立了多个ADOConnection,在连接时对应不同的帐套
是不是该在执行更新操作之前是先判断是否有该线程已启动了一个事物
 
to shsshashssha:
如何判断该线程已启动了一个事物?
 
默认状态(不用手工控制)就会出现.
解决:
在onupdatedata事件中将事物回滚,然后在BeforeUpdateRecord事件添上事物控制代码.
 
自已处理出错。
在onbeforeUpdateRecord中加入如下代码即可解决:
try

except
on e:exceptiondo

begin
Database.Rollback;
Database.StartTransaction;

end;
end;
 
我在用BCB5做多层结构系统时,我在Server端加入了一个取得服务器IP地址的方法:GetServerIP它的参数是vIP:Variant *,IN方式,并在服务端实现了这个方法,
加入的代码如下:
*vIP="192.168.0.01";最后我注册成功。
可是在我开发客户端程序时,我用TSocketConnection
当取得它的服务时我是这样做的:
Variant* vip;
SocketConnection1->AppServer.GetServerIP(vip);
Edit1->Tex=vip;
可 是我在运行程序时出错,没有编译通过。
它说getserverIP不是variant的成员
getserverIP is not a memober of variant
请问?
我该如何去调用这个方法呢?
请各位大侠多多指教?
小生的QQ:65466700(24小时在线恭候)
MAIL: alongsun@sina.com
 
多人接受答案了。
 
后退
顶部