如何鎖定某一列,其他連線仍可繼續使用此table |
答題得分者是:StrongLemon
|
SuperRock
一般會員 ![]() ![]() 發表:5 回覆:13 積分:3 註冊:2004-05-20 發送簡訊給我 |
假設某一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 發送簡訊給我 |
推測您是想做到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 發送簡訊給我 |
|
StrongLemon
高階會員 ![]() ![]() ![]() ![]() 發表:10 回覆:166 積分:105 註冊:2004-04-18 發送簡訊給我 |
觀念部分:
begin tran
commit tran
指令是一次下給資料庫,除非資料庫掛了..
才會執行到一半..
再者資料庫掛了你也不用做事了啊.. Client如果跟資料庫不正常斷線..
也幾乎會是自動rollback.. 通常跑不到commit tran大部分都是寫SQL有問題..
同時有兩個begin tran 再互相等待對方會造成dead lock.. 問題的回答:
不正常斷線情況下,
以MSSQL而言,還是有機會碰到lock殘留。
這時候就得人工去kill process。
Oracle目前還沒有碰過。
|
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |