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

如何鎖定某一列,其他連線仍可繼續使用此table

答題得分者是:StrongLemon
SuperRock
一般會員


發表:5
回覆:13
積分:3
註冊:2004-05-20

發送簡訊給我
#1 引用回覆 回覆 發表時間:2004-12-13 01:24:06 IP:218.168.xxx.xxx 未訂閱
假設某一table有n個序號並有100個使用者會連上server要序號,並用select min(***)由小到大select,我試過可以用 [ begin transaction ----select min(***)-->select最小序號 ----update -->update此一列 commit transaction] 但下一個連線者必須等待commit transaction指令執行完才可進行SQL指令,我想要的是先連線的select到號碼1,第二連線select到號碼2,第三連線select到號碼3...,並可同時進行,也可做update的動作,請問可否做到,若不行有無其他方式可解決,thanks a lot
StrongLemon
高階會員


發表:10
回覆:166
積分:105
註冊:2004-04-18

發送簡訊給我
#2 引用回覆 回覆 發表時間:2004-12-13 03:00:01 IP:211.74.xxx.xxx 未訂閱
推測您是想做到Row or Record Lock.. 請參考看看以下連結。    http://www.delphi32.com/info_facts/faq/faq_988.asp 不過以交易的觀點來看,因為你必須抓整個Table才能夠知道每個連線使用者 要用哪個序號,所以勢必必須每個連線進來對此Table必須鎖住做完交易才能 讓下一個連線使用。 建議是:登入後提出交易說這個連線使用哪筆序號,然後註記此序號被使用。 begin Tran Select min(No) from xxx where Used='0' update XXX set Used='1' where No=MinNo commit tran 爾後連線都用此序號做異動,直到連線離線或者不正常斷線再把那筆Used='0'
SuperRock
一般會員


發表:5
回覆:13
積分:3
註冊:2004-05-20

發送簡訊給我
#3 引用回覆 回覆 發表時間:2004-12-13 08:39:39 IP:61.220.xxx.xxx 未訂閱
Thanks StrongLemon詳答,再請問如果在 begin Tran Select min(No) from xxx where Used='0' update XXX set Used='1' where No=MinNo 過程中,某一台電腦尚未下達"commit tran"而當機或某種原因未完成交易,那其它台電腦會不會無法連線,若是該如何處理?
StrongLemon
高階會員


發表:10
回覆:166
積分:105
註冊:2004-04-18

發送簡訊給我
#4 引用回覆 回覆 發表時間:2004-12-13 12:35:14 IP:221.169.xxx.xxx 未訂閱
觀念部分: begin tran commit tran 指令是一次下給資料庫,除非資料庫掛了.. 才會執行到一半.. 再者資料庫掛了你也不用做事了啊.. Client如果跟資料庫不正常斷線.. 也幾乎會是自動rollback.. 通常跑不到commit tran大部分都是寫SQL有問題.. 同時有兩個begin tran 再互相等待對方會造成dead lock.. 問題的回答: 不正常斷線情況下, 以MSSQL而言,還是有機會碰到lock殘留。 這時候就得人工去kill process。 Oracle目前還沒有碰過。
系統時間:2024-06-25 14:11:48
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!