計(jì)算機(jī)學(xué)習(xí)積累

          ----轉(zhuǎn)載有理,轉(zhuǎn)載是想研究,想研究才會(huì)看,看了才會(huì)有感想,轉(zhuǎn)載后我有時(shí)會(huì)寫(xiě)一些自己的感受
          數(shù)據(jù)加載中……

          使用事務(wù)與鎖,實(shí)現(xiàn)一個(gè)用戶取過(guò)的數(shù)據(jù)不被其他用戶取到(轉(zhuǎn)鄒健)

          問(wèn)題描述:

          ADO 訪問(wèn)數(shù)據(jù)庫(kù),從一個(gè)表中取一定的記錄(比如 20 行),取出后在程序中使用,使用完后刪除掉記錄(不用更新或刪除記錄)。在多用戶操作下 ( 每個(gè)用戶采用相同的操作 ) ,怎么保證一個(gè)用戶已選取的記錄不被其他用戶選取 ?

          ?

          問(wèn)題解決:

          處理這類問(wèn)題的一般方法是增加一個(gè)標(biāo)志列,每個(gè)用戶取的記錄設(shè)置一個(gè)標(biāo)志,新的用戶只從標(biāo)志為未取的記錄中獲取記錄。

          而本文利用事務(wù)與鎖來(lái)控制數(shù)據(jù)的處理,不需要增加任何標(biāo)志列

          下面是具體的解決示例

          ?

          1. ?????? 建立測(cè)試環(huán)境

          USE tempdb

          GO

          ?

          CREATE TABLE dbo.tb(

          id intidentity(1, 1),

          name nvarchar (128))

          ?

          INSERT tb(name)

          SELECT TOP 100

          name

          FROM syscolumns

          GO

          ?

          2. ?????? 模擬第 1 個(gè)用戶

          -- 查詢窗口發(fā)出下面的查詢語(yǔ)句

          BEGIN TRAN

          ??????? -- 事務(wù)不提交或者回滾 , 以保持鎖不釋放

          SET ROWCOUNT 20

          SELECT *

          FROM tb WITH(UPDLOCK, READPAST)

          ??????? -- UPDLOCK 讓鎖保留到事務(wù)結(jié)束 , READPAST 跳過(guò)已經(jīng)鎖定的數(shù)據(jù)

          ?

          3. ?????? 模擬第 2 個(gè)用戶(語(yǔ)句與第 1 個(gè)用戶一樣,只是在另一個(gè)連接中執(zhí)行)

          -- 查詢窗口發(fā)出下面的查詢語(yǔ)句

          BEGIN TRAN

          ??????? -- 事務(wù)不提交或者回滾 , 以保持鎖不釋放

          SET ROWCOUNT 20

          SELECT *

          FROM tb WITH(UPDLOCK, READPAST)

          ??????? -- UPDLOCK 讓鎖保留到事務(wù)結(jié)束 , READPAST 跳過(guò)已經(jīng)鎖定的數(shù)據(jù)

          ?

          4. ?????? 結(jié)果

          你會(huì)看到

          查詢窗口 1 列出了前 20 條數(shù)據(jù)

          查詢窗口 1 列出了 21-40 條數(shù)據(jù)

          ?

          這樣就實(shí)現(xiàn)了不同的用戶取不同數(shù)據(jù)的需求 .

          ?

          : 處理完成后 , 刪除記錄 , 然后提交事務(wù)就可以了 .

          posted on 2009-04-28 15:55 freebird 閱讀(197) 評(píng)論(0)  編輯  收藏 所屬分類: 數(shù)據(jù)庫(kù)

          主站蜘蛛池模板: 延川县| 邹平县| 新乐市| 三河市| 白玉县| 思南县| 镇江市| 本溪市| 沂源县| 封丘县| 公安县| 民县| 德清县| 新绛县| 舒兰市| 江安县| 龙口市| 阿克陶县| 通城县| 通化县| 罗江县| 道真| 莒南县| 沧源| 中阳县| 富宁县| 融水| 东安县| 革吉县| 高碑店市| 远安县| 米易县| 海晏县| 密云县| 河北区| 府谷县| 盐亭县| 龙州县| 上犹县| 浑源县| 云南省|