全國最多中醫師線上諮詢網站-台灣中醫網
發文 回覆 瀏覽次數:1654
推到 Plurk!
推到 Facebook!

ClientDataSet會造成table Lock

尚未結案
ivankuo
中階會員


發表:132
回覆:272
積分:95
註冊:2002-11-21

發送簡訊給我
#1 引用回覆 回覆 發表時間:2004-02-02 09:37:42 IP:61.221.xxx.xxx 未訂閱
小弟使用TSQLQuery TClientDataSet,但發現若TClientDataSet的PacketRecords若有限制每次抓取的筆數的話,會造成table Lock 除非下select * from table1 (NOLOCK)的方式,有其他方式可以解決嗎??
------
ivankuo
Jasonwong
版主


發表:49
回覆:931
積分:581
註冊:2006-10-27

發送簡訊給我
#2 引用回覆 回覆 發表時間:2004-02-02 14:02:45 IP:203.75.xxx.xxx 未訂閱
TABLE LOCK ??? 沒遇過耶... 能不能把你的錯誤訊息跟SOURCE貼上來呢 -- 聰明的人,喜歡猜心;雖然每次都猜對了,卻失去了自己的心 傻氣的人,喜歡給心;雖然每次都被笑了,卻得到了別人的心
------
聰明的人,喜歡猜心;雖然每次都猜對了,卻失去了自己的心
傻氣的人,喜歡給心;雖然每次都被笑了,卻得到了別人的心
ivankuo
中階會員


發表:132
回覆:272
積分:95
註冊:2002-11-21

發送簡訊給我
#3 引用回覆 回覆 發表時間:2004-02-02 15:22:41 IP:61.221.xxx.xxx 未訂閱
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

發送簡訊給我
#4 引用回覆 回覆 發表時間:2004-02-03 19:53:05 IP:61.226.xxx.xxx 未訂閱
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

發送簡訊給我
#5 引用回覆 回覆 發表時間:2004-02-04 11:21:55 IP:61.221.xxx.xxx 未訂閱
ohnny2212兄 我的測試資料庫只有我一個人使用,不會有其他人,我所說的lock是在PacetRecords設數值的時後喔,您確定不會嗎??,但若設定為-1的話則不會,我也不是多層次的架構,只是C/S-而已,至於ApplyUpdates的問題,小弟之前預過會有問題,只是後來也不能解決,我自己另外用command的方式去做增修刪處理。
------
ivankuo
johnny2212
初階會員


發表:34
回覆:65
積分:39
註冊:2003-04-09

發送簡訊給我
#6 引用回覆 回覆 發表時間:2004-02-04 13:15:41 IP:61.226.xxx.xxx 未訂閱
我試過真的不會(PacketRecords有設定值),不然你用另一個方法(我都這麼做),把DataSetProvider作成無狀態物件,也就是DataSetProvider不會一直幫你維持DataSet,好處在於AP端不會接受全部的資料,不會導致AP的當機,至於如何做,請參考Delphi範例Midas下的Pooler,如此再試試看應該就不會了,若還是會 ,你就必須將整個程式拿出來供大家參考 我必須說明,若你不是作成無狀態物件,資料會全部下來的(datasetprovider會接受全部的資料),你寫在同一台機器上(Provider和ClientDataSet在一起),PacketRecords的數值是沒有意義的,因為資料還是全部下到Client端
ivankuo
中階會員


發表:132
回覆:272
積分:95
註冊:2002-11-21

發送簡訊給我
#7 引用回覆 回覆 發表時間:2004-02-04 15:26:30 IP:61.221.xxx.xxx 未訂閱
前輩,感謝您熱心回應, 我的程式是寫同一台機器上(DataSet (DBX) ,Provider和ClientDataSet在一起),PacketRecords的數值還是有作用阿,他並不是全部下載到Client,不信您可以試試看。至於您說的無狀態物件應該只能用在多層次架構上吧?? 我的環境是D7 MSSQL2000 發表人 - IVANKUO 於 2004/02/04 15:51:52
------
ivankuo
johnny2212
初階會員


發表:34
回覆:65
積分:39
註冊:2003-04-09

發送簡訊給我
#8 引用回覆 回覆 發表時間:2004-02-05 04:03:07 IP:61.226.xxx.xxx 未訂閱
你以前大概沒用過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

發送簡訊給我
#9 引用回覆 回覆 發表時間:2004-02-05 15:20:42 IP:61.226.xxx.xxx 未訂閱
對不起,我要做一點修正,因為我用的是SoapDataModule的CGI,所以會有以上的現象(我也必須要如此做),因為CGI會自動Free掉;至於使用DCom或C/S可不可以造成上述的結果,我不敢確定(你可以自己試試看,我的DataBase沒有大量資料),若C/S沒有以上的結果,還是全部的資料Load下來(你可觀看記憶體使用大小),那就不必將其作成無物件狀態,因為在C/S中的的DataSetProvider只服務一個Client端
ivankuo
中階會員


發表:132
回覆:272
積分:95
註冊:2002-11-21

發送簡訊給我
#10 引用回覆 回覆 發表時間:2004-02-06 13:39:54 IP:61.221.xxx.xxx 未訂閱
johnny2212前輩,您凌晨四點還幫我回應,真是大好人,小弟的方式我有去查看記憶體的大小,他並不會將全部的資料都下載,不過很奇怪的事情,今天在進行測試lock的問題的時候,發現不會Lock了,好怪喔,那天測試的時候真的不能update,我發四,不過中間有發生一些系統網域授權問題,我連delphi 7要開啟專案都開不了,會出現vcl70.bpl,vclx70.bpl錯誤的訊息,後來請系統人員重新對我的網域帳號設定權限,才解決此問題,之後再測試lock的問題就沒遇到了,反正一切很詭異,不過還是很感謝前輩熱心指點,您的ApplyUpdate問題我也沒辦法幫你解決,之前我也有問過,但是還是有error出現,讓您參考我之前所發的問題吧,雖然還沒解決,但是有其他大大所提的內容。 http://delphi.ktop.com.tw/topic.php?TOPIC_ID=35887
------
ivankuo
系統時間:2024-07-01 18:38:06
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!