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

使用ADO MS資料庫 C/S架構 當二個使用者對同一個資料庫做UpdateBatch的問題

尚未結案
kulius
一般會員


發表:13
回覆:23
積分:17
註冊:2002-03-15

發送簡訊給我
#1 引用回覆 回覆 發表時間:2005-06-15 11:56:19 IP:61.221.xxx.xxx 未訂閱
環境: DELPHI7 MS 資料庫 C/S架構 程式需求功能 進銷存會計-對立沖帳的管理 會計輸入畫面為M/D的架構,使用者在輸入DETAIL時,打入會計科目可即時帶出目前的立帳未沖的金額,如果為二筆DETAIL對相同的立帳做登打,也須帶出正確的立帳餘額量如下例 打入科目 帶出立帳餘額 改成 這時立帳餘額 001 500 300 200 打入科目 帶出立帳餘額 001 200 為了以上的功能我把立沖帳檔與M/D的TABLE一起做CommitTrans 都沒問題 問題在於,有二個使用者同時對001這個科目做存取 這時就會出現找不到"更新列的問題" 因為A使用者.及B使用者同時對 立帳檔做取的動作 A使用者先存檔...但B還在編輯...當B按下存檔時...就錯誤了 請問有無方法來避免
cancer
高階會員


發表:58
回覆:319
積分:190
註冊:2004-07-31

發送簡訊給我
#2 引用回覆 回覆 發表時間:2005-06-15 23:09:24 IP:210.201.xxx.xxx 未訂閱
把負責會計作業的伺服器設為 Single User Mode 行不行? 每次只讓一位有權更新會計系統的人進行連線。
kulius
一般會員


發表:13
回覆:23
積分:17
註冊:2002-03-15

發送簡訊給我
#3 引用回覆 回覆 發表時間:2005-06-16 08:57:04 IP:61.221.xxx.xxx 未訂閱
引言: 把負責會計作業的伺服器設為 Single User Mode 行不行? 每次只讓一位有權更新會計系統的人進行連線。
^^...感謝您的回答 但並不是袛有會計才用這個機制,包含庫存(帶出目前庫存)..等等 所以....是否有解...不然小弟還是得回去採用單純的POST..
timhuang
尊榮會員


發表:78
回覆:1815
積分:1608
註冊:2002-07-15

發送簡訊給我
#4 引用回覆 回覆 發表時間:2005-06-16 09:42:11 IP:203.95.xxx.xxx 未訂閱
Hi, 使用 transaction 來包含一次性異動是最理想的設計, 但由於使用者同時去操作同筆資料, 於是會發生先存先贏的現象, 後存的使用者, 若是要異動的資料, 該筆 primary key 未能找到時, 當然就會發生你看到的狀況, 這時要處理的方法就看設計的概念.    1. 前面一個使用者已處理完成, 後面處理的使用者就得承認該筆異動若是成立的話, 那就後面的使用者異動將被放棄, 並且重新取回最新的資料狀況, 並通知後面的使用者, 其異動失敗, 系統將重新取得最新資料. 2. 利用處理者的方式管理, 每筆異動前, 就先檢查使用者戳記是否為自己(其實就是再開一個欄位來存目前正在操作的使用者), 若沒有人操作, 就壓下該使用者, 讓其他使用者要操作該筆資料時, 限制異動, 直到該欄位被清空為止, 此法要注意的是若已壓下使用者戳記的連線突然失去時, 如何解決? (通常是不處理, 直到有人要異動時, 自然會被告知該筆資料有某使用者(a)正在異動, 再由該使用者(a)存取該筆資料, 正常離開, 就會壓回空值) 解決的方法很多, 資料庫之所以要包裝 transaction 就是要減少資料不一致的問題, 並降低開發的困難, 試試看吧!
cancer
高階會員


發表:58
回覆:319
積分:190
註冊:2004-07-31

發送簡訊給我
#5 引用回覆 回覆 發表時間:2005-06-17 23:34:45 IP:210.201.xxx.xxx 未訂閱
Kulius您好, 終於搞清楚您的需求。您的需求是: 第一個人讀取了某筆資料後,第二個人又讀取了相同的一筆資料,然後第一個人更新了這筆資料的內容,而您希望第二個人也能夠更新剛剛被更新過的那筆資料。 有兩種情形: 一.第一個人的更新,涉及到身份識別欄位,即組成主鍵的欄位。 二.第一個人的更新,沒有涉及到身份識別欄位。 如果是第一種情形,那麼第二個人當然無法更新已經不存在的一筆記錄,因為該筆記錄的身份識別已經改變了。 如果是第二種情形,那麼第二個人當然可以更新該筆資料,因為身份識別沒有改變。 如果您的情形是第一種情形,又希望第二個人能更新"您認為是同一筆的資料",唯一途徑是想辦法讓該筆資料保有相同的身份識別。如果您是使用MS Sql Server,那麼可以再建立一個欄位,把欄位指定為IDENTITY,此欄位專供身份識別之用,不存放資料,要更新有此欄位的資料錄時,在SQL中使用Where條件敘述,就可以把它定位出來。但如果第一個人刪除掉該筆資料,第二個人還是不能更新該筆資料,因為此時是整筆資料消失了,並非身份識別有所改變。 補充一下,IDENTITY欄位是我憑記憶回想起來的,如果有錯也不奇怪,但SQL Server肯定有這種東西,麻煩您自己查一查,或者請教其他高人。
bestlong
站務副站長


發表:126
回覆:734
積分:512
註冊:2002-10-19

發送簡訊給我
#6 引用回覆 回覆 發表時間:2005-06-18 16:34:58 IP:218.162.xxx.xxx 未訂閱
無論是不是 Cache Update 的資料異動做法, C/S 架構都會碰到同時易動同筆紀錄的問題, 只是 Cache Update 的處理上就是需要程式設計師多花一些心思. 而不採用 Cache Update 的方式則會面臨資料被鎖定的問題, 而且在沒有 Transaction 的保護下, 還會發生處理異動相關多個資料表發生錯誤時, 所衍生的資料不完整的問題, 最後需要人工介入處理. 雪龍 http://bestlong.no-ip.com/ 學海無涯覺無盡,勤做筆記防失憶
------
http://blog.bestlong.idv.tw/
http://www.bestlong.idv.tw/
http://delphi-ktop.bestlong.idv.tw/
bestlong
站務副站長


發表:126
回覆:734
積分:512
註冊:2002-10-19

發送簡訊給我
#7 引用回覆 回覆 發表時間:2005-06-18 17:03:20 IP:218.162.xxx.xxx 未訂閱
可以說明一下你的立沖帳的作法與儲存的結構. 比較好分析問題的層面. 另外你的立沖餘額直接儲存在資料表中, 應該可以改成即時運算的方式來處理. 或許可以解決問題. 雪龍 http://bestlong.no-ip.com/ 學海無涯覺無盡,勤做筆記防失憶
------
http://blog.bestlong.idv.tw/
http://www.bestlong.idv.tw/
http://delphi-ktop.bestlong.idv.tw/
kulius
一般會員


發表:13
回覆:23
積分:17
註冊:2002-03-15

發送簡訊給我
#8 引用回覆 回覆 發表時間:2005-06-21 14:31:20 IP:61.221.xxx.xxx 未訂閱
各位好: 花了四五天的時間..還是沒得到答案 不過還是先將整個系統架構和各位說明 簡單來說 是一個Master/Detail架構的程式與一個TABLE1的互動 採用BATCH的方式執行 已知TABLE1有二筆資料 001 1000元 002 2000元 這是對M/D做修改 打入編號001帶出1000元,這時001的餘額為零,這是正常狀況 客戶要求如下 打入編號001帶出1000元,但可修改金額為400此時001的餘額為600 立即DETAIL繼續輸入 打入編號001帶出餘額600元,此時GRID的畫面如下 編號 金額 001 400 001 600 若改第二筆600的金額改成700,要跑出錯誤訊息,說超出原始金額100元 這是第一種狀況,此時我的解決方式是將 M/D和TABLE一起做交易控管 但問題接著來了,若同時有二人對TABLE1中的001做動作的話 便會出現無法找到更新列的問題 還在思考怎麼處理
系統時間:2024-07-02 23:09:45
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!