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

在做update動作時,是否有lock指令可以先判斷data是否已被lock,

尚未結案
vivi666666
初階會員


發表:83
回覆:94
積分:35
註冊:2003-03-05

發送簡訊給我
#1 引用回覆 回覆 發表時間:2003-10-06 15:57:44 IP:203.69.xxx.xxx 未訂閱
在做update動作時,是否有lock指令可以先判斷data是否已被lock, 若lock則show,一些訊息..,不曉指令如何下
Jasonwong
版主


發表:49
回覆:931
積分:581
註冊:2006-10-27

發送簡訊給我
#2 引用回覆 回覆 發表時間:2003-10-06 17:01:59 IP:203.75.xxx.xxx 未訂閱
我想應該是沒有的...    不過你可以下 TRY..EXCEPT..END 指令    再去攔截他的錯誤訊息    他應該會告訢你    此記錄已被 LOCK 吧    我記得好像是這樣沒錯... -- 聰明的人,喜歡猜心;雖然每次都猜對了,卻失去了自己的心 傻氣的人,喜歡給心;雖然每次都被笑了,卻得到了別人的心
------
聰明的人,喜歡猜心;雖然每次都猜對了,卻失去了自己的心
傻氣的人,喜歡給心;雖然每次都被笑了,卻得到了別人的心
timhuang
尊榮會員


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

發送簡訊給我
#3 引用回覆 回覆 發表時間:2003-10-06 22:26:13 IP:61.62.xxx.xxx 未訂閱
基本上, 資料庫中資料被 lock 的機會應該是很低的, 然而, 使用者要求的指令執行, 資料庫會去排入執行, 會有一個 default 的 timeout, 當你要修改的資料被鎖定時, 你的指令仍舊會排入執行中, 但是若是等待時間超出預設的 timeout 時, 則資料庫會回覆 timeout 訊息給使用者, 當然, 若是你自己下的 command 發生 dead lock 時, 一樣會產生 timeout 的現象, 而導致資料庫也會去產生訊息, 使得你的異動發生 error, 如此一來就可以避免使用者長期佔用資料庫的資源, 導致資料庫無法工作. 當然, 若是在資料庫中特別設定某些身份的 user 不限制 timeout, 那使用這些身份 login 時, 要特別小心下達的 command. 避免發生資料庫大量鎖定的現象. 你的顧慮很好, 但是其實不需要考慮這麼多, 如同 Jasonwong 兄的提示, 直接使用 try 包住利用 error handle 的方式來傳達異動失敗的原因, 將是比較理想的程式流程, 而且你在 update 之前, 先確認了沒有鎖定, 再下達 update 時, 之間若是又發生的資料鎖定的現象, 問題一樣會發生的, 資料庫一樣會給你一個 error 的, 所以直接下達異動指令即可! 資料庫的鎖定方式很多種, 有 row lock, page lock, table lock, db lock 等狀況, 而且會隨著使用者包裝的 transaction 而影響的範圍可大可小, 資料庫引擎的複雜性可想而知了呢.
P.D.
版主


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

發送簡訊給我
#4 引用回覆 回覆 發表時間:2003-10-07 00:21:37 IP:61.66.xxx.xxx 未訂閱
引言: 在做update動作時,是否有lock指令可以先判斷data是否已被lock, 若lock則show,一些訊息..,不曉指令如何下
不知資料庫何種? 1.如果是 DB, DBF , BDE有提供LOCK原型(沒有封包成VCL PROPERITY), 可以鎖定 2.如果是CLIENT SERVER資料庫可以透過 Transaction(交易)方式來做, 在 EDIT前先對某一個欄位下 UPDATESQL填入註記 例如下例模式
     ......
     SQLupdate:= 'update ' Table_Name ' set NETMARK="1" ' wherekey;
     try
        aSQL.SQL.Clear;
        aSQL.SQL.Text:= SQLupdate;
        while not stopTry do
        try
           // 進行存入 flag 動作, 如果存入失敗表示被鎖住
           if not aLockTrans.InTransaction then aLockTrans.StartTransaction;
           ......
           aSQL.ExecQuery;
           result:= True;
           exit;
        except
           on E: Exception do begin
              aLockTrans.Rollback;
              aLockTrans.Active:= False;
              IDkey:= Application.MessageBox(pChar('【' recordstr '鎖定失敗】' 
                      dbfName #13 '是否再嘗試鎖定一次?' #13 cancelstr #13 #13 
                      '【系統中斷說明】' E.Message),'網路錯誤',
                      MB_ICONINFORMATION key MB_DEFBUTTON1);
              stopTry   := IDkey<>ID_YES;
              netCancel := IDkey=ID_CANCEL;
              netRefresh:= IDkey=ID_YES;
           end;
        end;
.....
發表人 - P.D. 於 2003/10/07 00:23:37
系統時間:2024-05-18 14:08:48
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!