ClientDataSet會造成table Lock |
尚未結案
|
ivankuo
中階會員 發表:132 回覆:272 積分:95 註冊:2002-11-21 發送簡訊給我 |
|
Jasonwong
版主 發表:49 回覆:931 積分:581 註冊:2006-10-27 發送簡訊給我 |
|
ivankuo
中階會員 發表:132 回覆:272 積分:95 註冊:2002-11-21 發送簡訊給我 |
procedure TForm1.Button1Click(Sender: TObject);
begin
ClientDataSet1.Active:=false;
ClientDataSet1.PacketRecords:=50;
ClientDataSet1.Active:=true;
end; 當我的PacketRecords有限制筆數的時候,用SQL Server 2000的SQL Query Analyzer 去下Update的指令才會發生無法update,最後會變成Timer Out,若是為-1的話就不會了。
------
ivankuo |
johnny2212
初階會員 發表:34 回覆:65 積分:39 註冊:2003-04-09 發送簡訊給我 |
ClientDataSet是不可能造成TableLock,ClientDataSet只是一個接受資料的
元件,透過DataSetProvider修改資料;我認為真正會造成Table Lock是SQLConnection,你不妨看看你是否有建交易,如別人有下SQlConnection1.StartTransAction而你不自知(如果你用多層次,或許別人在AP端有建交易,而你不知道),又或者是你使用MTS而使Table造成lock的現象,總之我試過好幾遍都不會有你所說的現象
不過我倒遇到一個問題,就是PacetRecords設數值時,
ClientDataSet1.ApplyUpdates會不能執行,故我只能用呼叫AppServer去做,你若是可以Update的話,能否告訴我你如何用ClientDataSet去修改資料的(會不會正是如此而造成你的Table Lock)?
|
ivankuo
中階會員 發表:132 回覆:272 積分:95 註冊:2002-11-21 發送簡訊給我 |
|
johnny2212
初階會員 發表:34 回覆:65 積分:39 註冊:2003-04-09 發送簡訊給我 |
我試過真的不會(PacketRecords有設定值),不然你用另一個方法(我都這麼做),把DataSetProvider作成無狀態物件,也就是DataSetProvider不會一直幫你維持DataSet,好處在於AP端不會接受全部的資料,不會導致AP的當機,至於如何做,請參考Delphi範例Midas下的Pooler,如此再試試看應該就不會了,若還是會
,你就必須將整個程式拿出來供大家參考
我必須說明,若你不是作成無狀態物件,資料會全部下來的(datasetprovider會接受全部的資料),你寫在同一台機器上(Provider和ClientDataSet在一起),PacketRecords的數值是沒有意義的,因為資料還是全部下到Client端
|
ivankuo
中階會員 發表:132 回覆:272 積分:95 註冊:2002-11-21 發送簡訊給我 |
|
johnny2212
初階會員 發表:34 回覆:65 積分:39 註冊:2003-04-09 發送簡訊給我 |
你以前大概沒用過DataSetProvider吧,我再重新舉個例子o你下一道Sql Command ”Select * from table”共有一萬筆資料,把PacketRecords設定1000,你的確在Client端看到只有1000筆資料,但你有沒有想過剩下的9000筆資料跑到哪去了?一定要有東西收下來吧,不然你這道SQL Command根本就不成立(DataBase一定會把這道指令執行完畢),所以剩下的9000筆資料當然就被DataSetProvider收下來了o若你用Multi-Tier,剩下的9000筆資料就跑到AP端;若你用Client/Server,剩下的9000筆自然就跑到Client端(只是資料在DataSetProvider上,不在ClientDataSet上)o所以你的Packet Records有設數值,雖然感覺上好像把資料中斷,但實際上DataSetProvider仍處於“狀態中”,也就是DataSetProvider仍在維護剩下的9000筆資料o
若你把DataSetProvider改成無狀態物件(用Locate的方式),DataSetProvider就在收到1000筆資料後自然中斷(有點像Sql的Top1000只給前1000筆資料)
,Client後續要求資料(用CloneCursor的方式),DataSetProvider再去取另外的1000筆資料而後再中斷,雖然會變的有點慢(因為和資料庫反覆的要資料),但這樣才能真正的處理大型資料,不然有數千萬筆資料,很容易當機o我這麼解釋,不知你是否了解o
至於你所說的Table Lock的問題,我再給個建議,你改用ADO試試看(一樣要用DataSetProvider),若還是會有Lock的情況,那可能就是DataBase的問題了,你不妨重新建立一個新的DataBase再試試看o最後一句,沒有”交易”是不可能造成Table Lock的o
|
johnny2212
初階會員 發表:34 回覆:65 積分:39 註冊:2003-04-09 發送簡訊給我 |
|
ivankuo
中階會員 發表:132 回覆:272 積分:95 註冊:2002-11-21 發送簡訊給我 |
johnny2212前輩,您凌晨四點還幫我回應,真是大好人,小弟的方式我有去查看記憶體的大小,他並不會將全部的資料都下載,不過很奇怪的事情,今天在進行測試lock的問題的時候,發現不會Lock了,好怪喔,那天測試的時候真的不能update,我發四,不過中間有發生一些系統網域授權問題,我連delphi 7要開啟專案都開不了,會出現vcl70.bpl,vclx70.bpl錯誤的訊息,後來請系統人員重新對我的網域帳號設定權限,才解決此問題,之後再測試lock的問題就沒遇到了,反正一切很詭異,不過還是很感謝前輩熱心指點,您的ApplyUpdate問題我也沒辦法幫你解決,之前我也有問過,但是還是有error出現,讓您參考我之前所發的問題吧,雖然還沒解決,但是有其他大大所提的內容。 http://delphi.ktop.com.tw/topic.php?TOPIC_ID=35887
------
ivankuo |
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |