交易控制問題(100分)

Y

ywjjj

Unregistered / Unconfirmed
GUEST, unregistred user!
李維<<Delphi5.x分散式多層應用系統篇>> 3-2-3中有這樣一段話:'當應用程式伺服器的
Tdatasetprovider收到用戶端的呼叫(ApplyUpdates)時,在開始更新資料庫之中資料時,
應用程式伺服器便開始進入交易控制狀態,一直到異動的資料成功的更新回資料庫之後才會
呼叫Commit確認'......'在多層應用系統中用戶端需要異動資料時,程式師不需要在用戶端
或是應用程式伺服器中自行呼叫StartTransaction再進入另一個交易控制'.
以此為理論根據,實作當中我們在客戶端就只這樣寫;
'clientdataset1.applyupdate(-1);clientdataset2.applyupdate(-1);'
結果有如下問題產生;
1.clientdataset1成功異動,clientdataset2報錯返回,clientdataset1和clientdateset2
沒宥同時rollback,我們認為此問題很嚴重.
2.經常報錯:'A user transaction is already in progress'
'Changed record is used by another user'
以致無法異動資料.
我想對以上李維那段話我們肯定存在理解上的偏差,望各位高手指出來;同時我們實作當中
的問題亦望得到各位指點,謝謝!
我們是用 delphi5+midas+sql7.0 開發的.









 
可以自己写方法,将 ClientDataSet.Delta 传给app server处理,自己来处理
transaction的commit和rollback。
 
謝謝Pipi.,報錯信息怎樣處理掉?
 
對以上問題我問了李維,回答如下:
首先谢谢您购买<<delphi5.x 分散式多层应用系统篇>> 一书. 在此回答您的问
题如下:

当您呼叫了clientdataset1.applyupdate(-1)之后, MIDAS会产生一个
StartTransaction和Commit/Rollback的行动.因此当您使用
clientdataset1.applyupdate(-1);clientdataset2.applyupdate(-1);时
这2个Applyupdate会启动2个独立的交易来异动资料, 所以这是为什么您会发生
1.clientdataset1成功异动,clientdataset2报错返回,clientdataset1和
clientdateset2 没宥同时rollback
要解决这个问题并不简单, 在服务器上写了database.starttransaction,
database.roolback.database.commit并不正确, 因为这样会启动nested交易,
因此您会发生
调用他们之后,'A user transaction is already in progress'的错误信
息比前面更频繁
要解决这个问题, 您可以在Appserver之中自行定义一个方法, 例如叫
MultiApplyUpdates, 然后在客户端把clientdataset1和clientdatast2的Delta传
递给MultiApplyUpdates:
DCOMConnecgtion1.AppServer.MultiApplyUpdates(ClientDataset1.Delta,
ClientDataSet2.Delta);
至于Appserver之中的MultiApplyUpdates必须自行根据ClientDataset1.Delta,
ClientDataSet2.Delta来更新资料. 或是参考<<ado/mts/com+...>>一书中的9-3小
节修改MIDAS启动交易的程式码, 然后在MultiApplyUpdates方法中先行启动交易,
再呼叫TDataSetProvider1和TDataSetProvider2的IAS_ApplyUpdates, 再依据执行
的结果呼叫Commit或是Rollback就可以了.
希望上面的说明能够帮助您
李维

(我按李維介紹的第二種方法修改MIDAS启动交易的程式码,還是有問題,請各位再給我
想想辦法)
 
ywjjj 大侠是怎样联系李维先生的,能否告知,在下也有若干问题想请教!
tks.
 
to BaKuBaKu
聯系李維,我是先從台灣購進旗標出版的李維先生的書,再將問題放到旗標網站
www.flag.com.tw的讀者留言薄上,旗標會將問題轉給李維先生.
如果您購買李維先生的書非旗標出版的,通過旗標出版社的網站聯系李維我想
肯定是不行的,不過您可以試試運氣,祝您好運!

 
tks,不过我是在大陆买的书。
 
我一向喜欢把这种交易控制(嘻嘻,不太习惯交易的说法)放到存储过程中实现的.
 
TO 小豬:
謝謝你關注我的問題.首先要說明的是我們手頭都是台灣帶過來的書,一些術語的叫法
是有些不同.比如'事務-交易'.'接口-介面'等.
其實你說'把这种交易控制放到存储过程中实现'不是不可以,只不過這已經完全是sql
或是oracle進行事務管理了.存储过程一般無法移置,而我們不久就會使用oracle.
上網詢問這個問題已有較長的時間了,的确可以這樣說'要解决这个问题并不简单'.
在此,我也不妨和大家一起討論一下有關midas事務管理問題.
先分析一下我所得到的答案:
PiPi介紹的方法與李維介紹的第一種方法類似,即不用midas本身提供的事務管理功能,
小豬介紹的方法亦如此;李維介紹的第二種方法是取消midas提供的事務管理功能.因此使用
midas存取資料要達到c/s架構的事務處理功能是不是可以這樣說:'就是不能使用midas提供
的事務處理功能'?
我以為目前midas事務的管理方式是有缺陷的,'當客戶端呼叫了2個Tclientdataset.applyupdate(-1)
之后,这2个Applyupdate会启动2个独立的交易来异动资料',其作法本身並無什么不妥,
問題是'在服务器上有了database.starttransaction,database.roolback.database.commit'
的方法,且呼叫了它們之時,當客戶端再呼叫Tclientdataset.applyupdate(-1)時,就不應該
再启动新的事務来异动资料.
本人愚見,望大家指正.有好的方法亦望各位與我分享.謝謝.


 
要等borland公司修正midas的这个缺陷可能要等到明年了,现在inprise全力
搞的是kylix呢.不过我觉得在现在这种软件设计的大环境下,要想真正实现
完全的通用性可能付出的代价太大了,不管是性能上的,还是功能上.也许牺牲
一点可移植性有时还是值得的.写到这里,我又想到一个问题,不知在sql标准中
对于存储过程和事务处理是怎样规定的,可不可以用标准的sql来实现呢?这应该可以
满足移植的需求.
 
ywjjj 你好
看了你问题,不过我懂,不能给你什么建议。发信的目的是想问你如何联系李维先生,我
有一些关于WEB应用的问题一直无法解决,你能告诉我联系他的方法吗?或者你能代转一
下我的问题吗?
 
ywjjj:如果你还要继续讨论请定期提前你的帖子,如果不想继续讨论请结束帖子。
 
多人接受答案了。
 
顶部