怎樣設計兩個USER之間的資料異動機制? |
答題得分者是:P.D.
|
chkkevin
一般會員 發表:34 回覆:64 積分:19 註冊:2007-05-17 發送簡訊給我 |
|
pedro
尊榮會員 發表:152 回覆:1187 積分:892 註冊:2002-06-12 發送簡訊給我 |
|
P.D.
版主 發表:603 回覆:4038 積分:3874 註冊:2006-10-31 發送簡訊給我 |
這的確是一個很棘手的問題, 其實到今天仍然沒有一個十全十美的做法, 僅提供個人經驗
一般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 發送簡訊給我 |
方法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 發送簡訊給我 |
|
P.D.
版主 發表:603 回覆:4038 積分:3874 註冊:2006-10-31 發送簡訊給我 |
對 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 發送簡訊給我 |
謝謝回覆~
在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 發送簡訊給我 |
|
chkkevin
一般會員 發表:34 回覆:64 積分:19 註冊:2007-05-17 發送簡訊給我 |
非常感謝C兄回覆,請問C兄玩了多少年Delphi才有如此功力呢?
小弟玩了都只是個半用月,現在嘗試做一個小型的ERP(40~50個table左右)來 練功,感覺上Delphi的功能涉及的範圍極之廣闊,可能比VC++更好(雖然小弟還未用過), 但真的不多教學文件(在香港有些人連Delphi都未聽過,打開報紙也沒有見要求請Delphi programer的工作), 請問有沒有較好的參考書可以介紹一下呢? ===================引 用 P.D. 文 章=================== Delphi中只提供 TSocketServer, TSocketClient, 也可以做到 TIdTcpip 接近的作用, TId是Indy公司出品的第三方控件, 業界用的十分多, 但資訊其實並不多, 本站有不少相關討論可以參考
------
獨學無友則孤陋寡聞,相識滿天下能知天下事 小弟是來自香港的~~多多指教 |
P.D.
版主 發表:603 回覆:4038 積分:3874 註冊:2006-10-31 發送簡訊給我 |
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |