線上訂房服務-台灣趴趴狗聯合訂房中心
發文 回覆 瀏覽次數:1185
推到 Plurk!
推到 Facebook!

困惑 多人使用同一條記錄﹗

答題得分者是:Justmade
qinmingzsj
一般會員


發表:9
回覆:12
積分:4
註冊:2003-05-08

發送簡訊給我
#1 引用回覆 回覆 發表時間:2003-07-24 17:59:04 IP:61.145.xxx.xxx 未訂閱
各位大俠﹕ 我遇到一個這樣的問題﹐希望幫我解決﹐急﹗﹗﹗﹗﹗﹗﹗﹗﹗﹗﹗ 我有如下表﹕ 訂單頭表 電腦編號﹐ 訂單號碼 訂單磅數 耗用磅數...... computer_id order_no pound o_pound...... 00001 FG-345 1000 0 工作單表﹕ 編號﹐ 電腦編號 開單磅數...... work_id computer_id w_pound ...... W_001 00001 800 W_002 00001 400 在程序中我使用ADOQUERY,并使用緩存(設置cachesize=1000)。 我開工作單時﹐如果有兩個客戶端同時使用﹐針對訂單磅數的銷數會出 現如下的錯誤﹕ 1.當第一個客戶端打開程序時准備開單時﹐在緩存中保存的訂單總數量是 1000磅。 2.當第二個客戶端同時(在第一個客戶端沒有保存之前)打開程序准備開單 時﹐在緩存中保存的訂單總數量也是1000磅 3.當第一個客戶端開單完成后,將數據保存﹐則訂單的耗用磅數為800磅。 4.當第二個客戶端同時開單時候他應該(因為訂單數量是1000)只有200磅 的可用﹐但是在緩存中卻有1000磅﹐所以還可以開單。而且開完工作單后 保存資料時﹐則訂單的耗用磅數又變為400磅。 如果客戶端很多的話﹐那么我的數據就會混亂不堪﹐那么我能用什么辦法解決這樣的問題呢﹖ 斑竹﹐幫我一把吧﹗我現在好煩呀﹗ 真的很急﹗﹗﹗﹗﹗﹗﹗﹗﹗﹗﹗﹗﹗﹗﹗﹗﹗﹗﹗﹗﹗﹗ 盼復﹗
P.D.
版主


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

發送簡訊給我
#2 引用回覆 回覆 發表時間:2003-07-24 20:39:54 IP:61.66.xxx.xxx 未訂閱
引言: 各位大俠﹕ 我遇到一個這樣的問題﹐希望幫我解決﹐急﹗﹗﹗﹗﹗﹗﹗﹗﹗﹗﹗ 我有如下表﹕ 訂單頭表 電腦編號﹐ 訂單號碼 訂單磅數 耗用磅數...... computer_id order_no pound o_pound...... 00001 FG-345 1000 0 工作單表﹕ 編號﹐ 電腦編號 開單磅數...... work_id computer_id w_pound ...... W_001 00001 800 W_002 00001 400 在程序中我使用ADOQUERY,并使用緩存(設置cachesize=1000)。 我開工作單時﹐如果有兩個客戶端同時使用﹐針對訂單磅數的銷數會出 現如下的錯誤﹕ 1.當第一個客戶端打開程序時准備開單時﹐在緩存中保存的訂單總數量是 1000磅。 2.當第二個客戶端同時(在第一個客戶端沒有保存之前)打開程序准備開單 時﹐在緩存中保存的訂單總數量也是1000磅 3.當第一個客戶端開單完成后,將數據保存﹐則訂單的耗用磅數為800磅。 4.當第二個客戶端同時開單時候他應該(因為訂單數量是1000)只有200磅 的可用﹐但是在緩存中卻有1000磅﹐所以還可以開單。而且開完工作單后 保存資料時﹐則訂單的耗用磅數又變為400磅。 如果客戶端很多的話﹐那么我的數據就會混亂不堪﹐那么我能用什么辦法解決這樣的問題呢﹖ 斑竹﹐幫我一把吧﹗我現在好煩呀﹗ 真的很急﹗﹗﹗﹗﹗﹗﹗﹗﹗﹗﹗﹗﹗﹗﹗﹗﹗﹗﹗﹗﹗﹗ 盼復﹗
1.當第一個客戶端開始開單(進入edit, 或insert)時請鎖定用量記錄, 則第二個以後的客戶即無法進入開單存取用量 2.當每一個客戶端要進行開單時, 先利用一個adoquery進行用量的檢查, select count(0) from ... where ... 這樣當第一個開單完成存取用量, 而第二個要進行開單時可以得到最新的用量值, 這樣就不會錯! 3.用一個thread來固定時間偵測用量資料庫, 如果用量有異動則即時顯示在每一個客戶端的畫面上 還有很多用法待你發掘, 僅提供參考~~~ 以上3種方式都可以交叉使用或單獨使用
Justmade
版主


發表:94
回覆:1934
積分:2030
註冊:2003-03-12

發送簡訊給我
#3 引用回覆 回覆 發表時間:2003-07-25 09:42:41 IP:218.16.xxx.xxx 未訂閱
建議存檔前重新讀入可用量值,對比一下這訂單數來計算新的可用量值來存檔。 你也可加入判斷若可用量低於0時甚麼辦。
qinmingzsj
一般會員


發表:9
回覆:12
積分:4
註冊:2003-05-08

發送簡訊給我
#4 引用回覆 回覆 發表時間:2003-07-25 10:01:56 IP:61.145.xxx.xxx 未訂閱
TO: P.D. 您好﹐謝謝您的回復。但是我還有些不明白的地方﹕ 1.當第一個客戶端開始開單(進入edit, 或insert)時請鎖定用量記錄, 則 第二個以後的客戶即無法進入開單存取用量。 因為我是使用緩存﹐當第一個客戶端開始開單(進入edit, 或insert)時 我該怎樣鎖定用量記錄呢﹖麻煩你教我好嗎﹖ 2.我先利用一個adoquery進行用量的檢查, 但是當第一個客戶端還沒有保 存的時候﹐那么這個adoquery檢查的用量還是最開始的用量呀﹗ 3.用thread來固定時間偵測用量資料庫﹐我又不知道該怎么寫﹐看來又只好 麻煩你呀﹗ TO: Justmade 這樣當然好﹐但是要處理的代碼就比較多啦﹗ 而且如果可用量值變化了﹐就必須讓客戶端重新開過這張單﹗ 還有沒有更好的辦法呢﹖ 盼復﹗
P.D.
版主


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

發送簡訊給我
#5 引用回覆 回覆 發表時間:2003-07-25 12:41:15 IP:61.66.xxx.xxx 未訂閱
引言: TO: P.D. 您好﹐謝謝您的回復。但是我還有些不明白的地方﹕ 1.當第一個客戶端開始開單(進入edit, 或insert)時請鎖定用量記錄, 則 第二個以後的客戶即無法進入開單存取用量。 因為我是使用緩存﹐當第一個客戶端開始開單(進入edit, 或insert)時 我該怎樣鎖定用量記錄呢﹖麻煩你教我好嗎﹖ 2.我先利用一個adoquery進行用量的檢查, 但是當第一個客戶端還沒有保 存的時候﹐那么這個adoquery檢查的用量還是最開始的用量呀﹗ 3.用thread來固定時間偵測用量資料庫﹐我又不知道該怎么寫﹐看來又只好 麻煩你呀﹗
1.每一種資料庫的鎖定機制都不同, 不知道你的database, 有一個比較偷懶的方法, 當第一個客戶進入後, 用一個資料庫或欄位標示一個註記符號(如1), 當第二個客戶要進入前先搜尋該資料庫是否該筆被註記為'1', 如是則表示有人在開單, 而在第一個客戶完成開單把'1'註記拿掉, 當然這如果發生不當的當機時, '1'的標記是無法被正常釋放, 你可能要另外處理 要不你就要使用交易機制, 有 ROLLBAK, COMMIT等方式, ADO的部份我比較不熟, ADOQUERY已經把這段包的很死, 所以下POST其實資料就完成交易行為, 找不到ROLLBACK, COMMIT , TRANSACTION等功能, 這段Justmade兄應該可以提供一些資訊吧! 2.這種方式, 你應該在用量資料庫中建立一個預取用量欄位, 當第一個客戶存取用量但未在完成開單之前就把所要存取用量加到這個預取用量中, 而第二個客戶要存取用量時, 你必須參考預取用量欄位與實際庫存用量欄位, 提供給第二個客戶看, 如果你要做到即時用量控管, 最好的方式還是使用交易模式, 因為SQL資料庫在交易上, 可以對SERVER做資料的即時更新(APPLYUPDATE), 而在完成開單時才進行存入行為(COMMIT), 如此不管那一個客戶進入都可以看到即時情況, 因為我是使用InterBase, 對ADO控制方面不很清楚, 可能請其他網友協助!
系統時間:2024-06-26 9:16:54
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!