台灣最大程式設計社群網站
線上人數
1453
 
會員總數:244570
討論主題:188711
歡迎您免費加入會員
討論區列表 >> ACCESS >> 請教DATA LOCK 的問題
[]  
[我要回覆]
回應主題 加入我的關注話題 檢舉此篇討論 將提問者加入個人黑名單
請教DATA LOCK 的問題
價值 : 100 QP  點閱數:3493 回應數:16

樓主

四維
初學者
64 78
3514 203
發送站內信

在Access 更新資料時,可用 Update .....或 先 edit 再 update,更新資料
在單機環境比較沒有問題(有時資料庫還是會 損壞)

但如果 資料表, 放在 伺服器 共多機連結
如果 多機同時 Update 同一個 Table 的 Record

想請問大大
有沒有比較 [隱] 的方法,防止 [互搶],而影響資料庫的損壞


本篇文章發表於2007-12-30 16:58
別忘捐VP感謝幫助你的人 新手會員瞧一瞧
1樓
回應

小君
捐贈 VP 給 小君 檢舉此回應
應該沒有解決的方法吧!

不要忘了,微軟當初設計Access是為了給「單機」Office所使用的。

你想要讓多機同時 Update 同一個 Table 的 Record,在Access或SQL Server上都是無解的
這是當初微軟所設計的資料庫引擎的特性

目前唯一能解決的方案應該是使用SQL Server 2005的快照隔離交易隔離
就可以達到你要的「多機同時 Update 同一個 Table 的 Record」
本篇文章回覆於2008-01-01 11:20
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
2樓
作者回應

四維
檢舉此回應
版主:你好
多機 [同時] Update 同一個 Table 的 Record,機率可能很低,
但如果碰到時的不知會怎樣?
這是我擔心的......

感謝 版主 寶貴的方法

本篇文章回覆於2008-01-01 14:27
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
3樓
回應

tungta
捐贈 VP 給 tungta 檢舉此回應
我的做法是:區別所有使用者所能開啟的表單,各負各的建檔範圍責任,不要讓相同表單有兩個使用者能開啟,就可以避開這個問題
本篇文章回覆於2008-01-01 18:06
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
4樓
回應

入江
檢舉此回應
目前是不曉得你的資料庫結構是如何?以前我們做ACCESS的時候,包含每個登入者都會做個操作記錄
也就是說..使用者目前正在做什麼,修改或新增什麼資料都先用VBA判斷一下再處理
四維大大你的問題我覺得應該朝這方面去研究就可以迎刃而解
本篇文章回覆於2008-01-01 18:11
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
5樓
回應

入江
檢舉此回應
與樓上發言差五秒..看來tungta大大和我的看法是一致的
本篇文章回覆於2008-01-01 18:14
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
6樓
最有價值解答

入江
檢舉此回應
還有兩種做法,
第一種做法就是假如A使用者和B使用者同時開啟一個表單
在表單的Load事件上判斷出有另一位使用者正在使用,就可以顯示一段提示,這是比較保守的方式
另一種方式是比較進階一點,可以說是比較專業級的做法但事實上並不難
用一個隱藏的表單,在資料庫開啟的時候就會自動在背景中隱藏開啟
表單也是要有資料表連結來做處理(你要連結什麼資料就看你需要這個表單去判斷什麼資料來決定)
這個表單要加上計數器在特定的時間裡判斷每位使用者的操作或當前操作,也要先判斷自己的資料是否有變更,如使用者變更資料
這個表單就先把自己的資料例如某個欄位從0改成1(目前這是A使用者的情況)
而B使用者也是一樣開啟相同的表單,也是一樣有一個隱藏的表單在後面運作
當隱藏的表單判斷到自己的資料本來是0已經變成1之後,再來更新B使用者的資料

這樣說你可能會聽的有點複雜..但以前我做過一個很大的資料庫是以這種概念來完成的
給你參考一下
本篇文章回覆於2008-01-01 18:34
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
7樓
作者回應

四維
檢舉此回應
tungta AND 入江:大大 你好
感謝你們提共的方法,先說聲謝謝
入江大大好久不見你的消息喔!

我現在[可能會]碰到的問題是:
一切架構還在ACCESS 環境,可能有 8 個USER 同時聯結到伺服器的資料庫
尤其在旺季 [不要讓相同表單有兩個使用者能開啟] ,實務上可能不可行

多機 [同時] Update 同一個 Table 的 Record,
我考慮的是 庫存檔,非常有可能在瞬間同時去 Update 同一 ITEM

入江大大的方法,我先想想,有不懂之處再請教



本篇文章回覆於2008-01-01 20:28
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
8樓
作者回應

四維
檢舉此回應
8 個USER 同時聯結到伺服器的資料庫

在 ACCESS 環境會不會太恐怖一點
本篇文章回覆於2008-01-01 20:46
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
9樓
回應

神來之筆
捐贈 VP 給 神來之筆 檢舉此回應
如果你用.net 連接Access可以這樣:

你在AccessDatasource, 把"使用開放式並行存取"打開
然後做相關的控制, 應該可以達到你的需求
該作法屬樂觀鎖定,也就是在寫入才去判定所要update的資料, 是不是已經被其他人更新,
如果是就回應使用者錯誤訊息

本篇文章回覆於2008-01-01 21:05
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
10樓
作者回應

四維
檢舉此回應
神來之筆大大:你好
我並不是用.net

全部 用 mde 去 連 mdb (全部在 access 環境 下)

感謝你
本篇文章回覆於2008-01-01 21:54
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
11樓
不錯的參考

入江
檢舉此回應
四維大大~是啊,好久不見,最近不常來~先祝你新年快樂喔
先說正事~
多使用者的資料處理一定要好好整體規劃一下,以後使用比較不會有問題
不論幾個人使用者,如果所有的人都要同時使用..我覺得至少要做個類似設定檔或使用狀態檔的東西來處理你的資料會比較適當,
我現在舉個你比較易懂和簡單的例子,你再想想看或者按我說的實作就能了解我的意思
例如有幾個資料表和一個表單如下
1.訂單資料表(欄位隨便)
2.使用者資料表(這個可有可無)
3.判斷資料表(裡面有ABC三個欄位)
A欄位=表單名稱
B欄位=使用狀態
C欄位=目前狀態


一個表單(連結訂單資料表)上面有兩個按鈕一是新增二是修改
每一個按鈕上的VBA都需要在執行動作前先去判斷和變更判斷資料表裡面的資料
現在前端使用者有甲和乙同時開啟這個表單準備新增或修改資料
例如甲按修改按鈕,判斷資料表的欄位資料應該用VBA先改成這樣
A欄位=XXXX表單(也就是甲和乙同時使用的表單)
B欄位=修改(或可用數字代替)
C欄位=修改中(或可用數字代替)
當甲修改完儲存記錄後,如果沒有關掉表單,儲存前用VBA變更判斷資料表的欄位資料恢復成預設或改如下
A欄位=XXXX表單(甲和乙同時使用的表單)
B欄位=已儲存(或可用數字代替)
C欄位=開啟中(或可用數字代替)

現在我們假設在甲修改資料途中,乙也跟著按下修改按鈕
這個時候乙使用者的VBA回頭判斷資料發現C欄位=修改中後就可以等使用者甲修改完後已儲存再處理乙的修改
因為VBA前端處理是不分甲或乙,不論幾個使用者都視同是當前使用者
不論當前使用者做了什麼動作,你都用VBA先寫入判斷資料表,以便後面的人可以透過這個資料表判斷使用狀態
這些動作在多使用者的使用狀況下事實上使用者是不知情的,一切都是程式在背後先判斷再處理
也就是說用VBA去執行動作前先依據判斷資料表去判斷目前的使用情形,然後VBA再做相應的處理即可
以這方向去思考就能了解,如果有問題再提出來


本篇文章回覆於2008-01-01 22:19
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
12樓
作者回應

四維
檢舉此回應
入江 大大:
非常感謝詳細說明
我先依你說明,慢慢吸收後,有問題再請教了

謝謝
本篇文章回覆於2008-01-02 09:42
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
13樓
作者回應

四維
檢舉此回應
入江 大大:
想請教

A欄位=表單名稱 ==>為何不是 資料表 或 資料表 內的 Item name(如貨號)

我的想法是:
我在進貨明細 or 銷貨明細 ....每一筆 record 就及時去 Update 庫存
所以 A欄位=表單名稱 是不是應 = 資料表名稱 或 Iten名稱

或 紀錄鎖定 就在 工具/選項/進階 /編輯記錄 交由Access 去處理就好 ?

補充說明:
[不要讓相同表單有兩個使用者能開啟]
是因為 瞬間量大,又急,所以 N 人同時開啟相同表單,是不可避免的(謝謝 tungta大大 )
本篇文章回覆於2008-01-02 11:07
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
14樓
回應

入江
檢舉此回應
你的想法也是對的
因為不知道你的資料結構複雜程度,所以我是用表單來舉例
如果你是及時去Update庫存那就記錄Item name沒錯
我的想法是因為表單大部份是連結資料表或查詢的
而且有的欄位是組合其他資料表欄位或者是關聯資料表
表單有連結和關聯的資料表都應該等待處理
讓一筆資料處理完再處理下一筆會比較好做
如果每一個欄位更新都需要及時處理,那A欄位就是等於你認為會造成"互搶"的Item name
大你可以先寫一段使用者變更資料或操作後,程式去更改這個判斷資料表,把使用者動作寫進去
然後就可以用程式讓下一個使用者變更記錄前先判斷這個資料表的變化再做相應處理
如果有問題或需要範例再跟我說一聲喔
本篇文章回覆於2008-01-02 13:19
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
15樓
回應

ETking
捐贈 VP 給 ETking 檢舉此回應
四維大大
不知道,您預設可能會發生的情形如何?

就現狀,內網分享資料庫(7部PC)和伺服器(11部PC)二個方面來看,倒沒有回報過類似Data Lock的情況。
(使用情況:開啟同一表單且儲存同一資料表)

在多部電腦共用資料庫之初,倒是碰過新增資料儲存時,發生「流水號」重號的問題,
為解此共用而產生的問題,當時也曾傷透腦筋過。
抓到的原因:先開啟表單輸入資料者,並不一定是最先儲存資料者。
最後解決方法:將所有異動資料表的動作,全部改寫在「儲存按鈕」中。

謹提供上述經驗參考
本篇文章回覆於2008-01-02 20:12
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
   

回覆
如要回應,請先登入.