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

怎樣設計兩個USER之間的資料異動機制?

答題得分者是:P.D.
chkkevin
一般會員


發表:34
回覆:64
積分:19
註冊:2007-05-17

發送簡訊給我
#1 引用回覆 回覆 發表時間:2008-02-26 03:55:42 IP:218.254.xxx.xxx 訂閱
情況是這樣:
當user1 update,insert,delete dateabase中的資料時,user2 又跟
user1一樣正在處理同一個table的資料,那麼當中user1改了table的資料後,
user2又怎樣辦好呢?

請先進們分享一下經驗,謝謝~~
------
獨學無友則孤陋寡聞,相識滿天下能知天下事
小弟是來自香港的~~多多指教
pedro
尊榮會員


發表:152
回覆:1187
積分:892
註冊:2002-06-12

發送簡訊給我
#2 引用回覆 回覆 發表時間:2008-02-26 08:55:49 IP:210.61.xxx.xxx 未訂閱
一般來說要異動之前會先檢查資料是否已先被異動過,或在where之後限制條件
狀況可處理,回應使用者,說資料已被異動過,然後重調資料確認

===================引 用 chkkevin 文 章===================
當user1 update,insert,delete dateabase中的資料時,user2 又跟
user1一樣正在處理同一個table的資料,那麼當中user1改了table的資料後,
user2又怎樣辦好呢?
P.D.
版主


發表:603
回覆:4038
積分:3874
註冊:2006-10-31

發送簡訊給我
#3 引用回覆 回覆 發表時間:2008-02-26 12:15:10 IP:61.67.xxx.xxx 未訂閱
這的確是一個很棘手的問題, 其實到今天仍然沒有一個十全十美的做法, 僅提供個人經驗
一般INSERT 是無法偵測的, 所以多半以EDIT, DELETE為主
1.有些資料庫(如 PARADOX), 當進入 EDIT時會自動鎖定記錄, 可以利用這點特性操作, 但無法運作在DELETE上
2.SQL的資料庫很多沒有自動鎖定的功能, 但有交易機制(TRANSACTION), 可以在A USER啟動EDIT或DELETE前, 先啟動交易(有點像鎖定), B USER 則判斷交易是否能啟動成功, 不成功代表有人正在使用
3.如果不懂交易機制, 還有一種做法, 就是當 A USER EDIT或DELETE時, 有一實際註記欄位, 填入1, 其他USER 要進入同一筆前, 先檢查這個欄位是否為1, 如果是則回應不能異動
當然每一種都有其漏洞及缺陷, 不能說那一種比較好, 只能視實際狀況決定
chkkevin
一般會員


發表:34
回覆:64
積分:19
註冊:2007-05-17

發送簡訊給我
#4 引用回覆 回覆 發表時間:2008-02-26 13:12:51 IP:218.254.xxx.xxx 訂閱
方法1。看來要在資料庫的選擇上,可是現在大多都是用SQL database了(小弟正在使用MySQL練功)。

方法2。交易機制(TRANSACTION),看來是比較好的方法,那麼又可不可以改為在delphi中設定的呢?

方法3。有想過用這個方法,但又有點浪費,而且需要每一條record都加上一個TOKEN,
所以前思後想最好都是交由database或者program處理好了。

多謝先進分享寶貴的經驗,這個問題應該是經常發生的,
只要user多過一個,各位先進都應該遇過,請問還有沒有
更好的方法呢?

===================引 用 P.D. 文 章===================
這的確是一個很棘手的問題, 其實到今天仍然沒有一個十全十美的做法, 僅提供個人經驗
一般INSERT 是無法偵測的, 所以多半以EDIT, DELETE為主
1.有些資料庫(如 PARADOX), 當進入 EDIT時會自動鎖定記錄, 可以利用這點特性操作, 但無法運作在DELETE上
2.SQL的資料庫很多沒有自動鎖定的功能, 但有交易機制(TRANSACTION), 可以在A USER啟動EDIT或DELETE前, 先啟動交易(有點像鎖定), B USER 則判斷交易是否能啟動成功, 不成功代表有人正在使用
3.如果不懂交易機制, 還有一種做法, 就是當 A USER EDIT或DELETE時, 有一實際註記欄位, 填入1, 其他USER 要進入同一筆前, 先檢查這個欄位是否為1, 如果是則回應不能異動
當然每一種都有其漏洞及缺陷, 不能說那一種比較好, 只能視實際狀況決定
------
獨學無友則孤陋寡聞,相識滿天下能知天下事
小弟是來自香港的~~多多指教
chkkevin
一般會員


發表:34
回覆:64
積分:19
註冊:2007-05-17

發送簡訊給我
#5 引用回覆 回覆 發表時間:2008-02-26 15:45:14 IP:218.254.xxx.xxx 訂閱
再引伸到另一個問題:~
在cachedupdate的狀況下,user2所看到的都人以往的資料,
如USER1已經變動了資料,怎樣可以令USER2自動更新資料呢?(有點像active decktop)
如不用TIMER,可不可以呢?
順帶一問,在dataset中autoRefresh是怎樣的情況下使用的呢?
------
獨學無友則孤陋寡聞,相識滿天下能知天下事
小弟是來自香港的~~多多指教
P.D.
版主


發表:603
回覆:4038
積分:3874
註冊:2006-10-31

發送簡訊給我
#6 引用回覆 回覆 發表時間:2008-02-27 10:39:57 IP:61.67.xxx.xxx 未訂閱
對 Oracle, db2, informix等超大型資料庫系統有沒有這樣的功能我不清楚, 至於其他的資料庫, 在delphi中所用的經驗是, 當你open一個資料庫時, 事實上已經有部份資料被下載到前端的buffer中記錄了, 如果 a 異動了 a1記錄, 而 a1記錄當好又被 b1 先載入時, 當然 a1 記錄不會被 sql 主動異動到 b 電腦, 所以這時會需要 b 重新執行 refresh或 close, open, 這是無法避免的, 要做到這樣的功能, 除了利用 timer 去定時掃瞄外, 其實還有一個做法, 利用 TIDtcpserver , TIDtcpclient 方式, 當a異動完記錄, a做 client, b做server, 由 a 發送一個訊息讓 b接收, b收到訊息後偵測 a1的資料庫是否正在開啟中, 如果是則重新主動 refresh(原理是這樣, 但還是要注意很多事項, 如 b 正在異動 c1記錄時怎麼辦), 這樣的做法不需要 timer的被動方式, 而是採用主動了, 至於我前面所說的Oracle或許有主動通知異動功能也說不定, 或者 M$SQL也有, 但我沒有十分深入去研究, 所以不是很清楚, 如果有興趣, 可以去查查google相關資料!
===================引 用 chkkevin 文 章===================
再引伸到另一個問題:~
在cachedupdate的狀況下,user2所看到的都人以往的資料,
如USER1已經變動了資料,怎樣可以令USER2自動更新資料呢?(有點像active decktop)
如不用TIMER,可不可以呢?
順帶一問,在dataset中autoRefresh是怎樣的情況下使用的呢?
chkkevin
一般會員


發表:34
回覆:64
積分:19
註冊:2007-05-17

發送簡訊給我
#7 引用回覆 回覆 發表時間:2008-02-27 11:23:43 IP:218.254.xxx.xxx 訂閱
謝謝回覆~

在delphi7的online-help 中,找不到TIDtcpserver , TIDtcpclient 的相關資料,難道
是外置元件嗎?請問有沒有相關的資料提供一下給小弟呢?

===================引 用 P.D. 文 章===================
對 Oracle, db2, informix等超大型資料庫系統有沒有這樣的功能我不清楚, 至於其他的資料庫, 在delphi中所用的經驗是, 當你open一個資料庫時, 事實上已經有部份資料被下載到前端的buffer中記錄了, 如果 a 異動了 a1記錄, 而 a1記錄當好又被 b1 先載入時, 當然 a1 記錄不會被 sql 主動異動到 b 電腦, 所以這時會需要 b 重新執行 refresh或 close, open, 這是無法避免的, 要做到這樣的功能, 除了利用 timer 去定時掃瞄外, 其實還有一個做法, 利用 TIDtcpserver , TIDtcpclient 方式, 當a異動完記錄, a做 client, b做server, 由 a 發送一個訊息讓 b接收, b收到訊息後偵測 a1的資料庫是否正在開啟中, 如果是則重新主動 refresh(原理是這樣, 但還是要注意很多事項, 如 b 正在異動 c1記錄時怎麼辦), 這樣的做法不需要 timer的被動方式, 而是採用主動了, 至於我前面所說的Oracle或許有主動通知異動功能也說不定, 或者 M$SQL也有, 但我沒有十分深入去研究, 所以不是很清楚, 如果有興趣, 可以去查查google相關資料!
===================引 用 chkkevin 文 章===================
再引伸到另一個問題:~
在cachedupdate的狀況下,user2所看到的都人以往的資料,
如USER1已經變動了資料,怎樣可以令USER2自動更新資料呢?(有點像active decktop)
如不用TIMER,可不可以呢?
順帶一問,在dataset中autoRefresh是怎樣的情況下使用的呢?
------
獨學無友則孤陋寡聞,相識滿天下能知天下事
小弟是來自香港的~~多多指教
P.D.
版主


發表:603
回覆:4038
積分:3874
註冊:2006-10-31

發送簡訊給我
#8 引用回覆 回覆 發表時間:2008-02-28 00:01:16 IP:61.67.xxx.xxx 未訂閱
Delphi中只提供 TSocketServer, TSocketClient, 也可以做到 TIdTcpip 接近的作用, TId是Indy公司出品的第三方控件, 業界用的十分多, 但資訊其實並不多, 本站有不少相關討論可以參考
chkkevin
一般會員


發表:34
回覆:64
積分:19
註冊:2007-05-17

發送簡訊給我
#9 引用回覆 回覆 發表時間:2008-02-28 02:33:05 IP:218.254.xxx.xxx 訂閱
非常感謝C兄回覆,請問C兄玩了多少年Delphi才有如此功力呢?
小弟玩了都只是個半用月,現在嘗試做一個小型的ERP(40~50個table左右)來
練功,感覺上Delphi的功能涉及的範圍極之廣闊,可能比VC++更好(雖然小弟還未用過),
但真的不多教學文件(在香港有些人連Delphi都未聽過,打開報紙也沒有見要求請Delphi programer的工作),
請問有沒有較好的參考書可以介紹一下呢?


===================引 用 P.D. 文 章===================
Delphi中只提供 TSocketServer, TSocketClient, 也可以做到 TIdTcpip 接近的作用, TId是Indy公司出品的第三方控件, 業界用的十分多, 但資訊其實並不多, 本站有不少相關討論可以參考
------
獨學無友則孤陋寡聞,相識滿天下能知天下事
小弟是來自香港的~~多多指教
編輯記錄
chkkevin 重新編輯於 2008-02-28 02:47:11, 註解 無‧
chkkevin 重新編輯於 2008-02-28 02:53:20, 註解 無‧
chkkevin 重新編輯於 2008-03-01 21:34:28, 註解 無‧
P.D.
版主


發表:603
回覆:4038
積分:3874
註冊:2006-10-31

發送簡訊給我
#10 引用回覆 回覆 發表時間:2008-02-28 14:11:55 IP:61.67.xxx.xxx 未訂閱
不好意思, 小弟為P兄啦! 學習無國界, 但現在要找Delphi的書真的很困難(至少台灣這邊是如此), 我開始踏入Delphi為3至今約七年吧! 有關提供給你的這方面技術也是近兩年內才有辦法接觸, 或許對接觸不深的人來說是有些困難, 建議你多找一些相關的桯式碼(demo)來現, 會比直接看書來的有用!
系統時間:2024-05-16 18:04:22
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!