計算機學習積累

          ----轉載有理,轉載是想研究,想研究才會看,看了才會有感想,轉載后我有時會寫一些自己的感受
          數據加載中……

          使用事務與鎖,實現一個用戶取過的數據不被其他用戶取到(轉鄒健)

          問題描述:

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

          ?

          問題解決:

          處理這類問題的一般方法是增加一個標志列,每個用戶取的記錄設置一個標志,新的用戶只從標志為未取的記錄中獲取記錄。

          而本文利用事務與鎖來控制數據的處理,不需要增加任何標志列

          下面是具體的解決示例

          ?

          1. ?????? 建立測試環境

          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 個用戶

          -- 查詢窗口發出下面的查詢語句

          BEGIN TRAN

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

          SET ROWCOUNT 20

          SELECT *

          FROM tb WITH(UPDLOCK, READPAST)

          ??????? -- UPDLOCK 讓鎖保留到事務結束 , READPAST 跳過已經鎖定的數據

          ?

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

          -- 查詢窗口發出下面的查詢語句

          BEGIN TRAN

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

          SET ROWCOUNT 20

          SELECT *

          FROM tb WITH(UPDLOCK, READPAST)

          ??????? -- UPDLOCK 讓鎖保留到事務結束 , READPAST 跳過已經鎖定的數據

          ?

          4. ?????? 結果

          你會看到

          查詢窗口 1 列出了前 20 條數據

          查詢窗口 1 列出了 21-40 條數據

          ?

          這樣就實現了不同的用戶取不同數據的需求 .

          ?

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

          posted on 2009-04-28 15:55 freebird 閱讀(201) 評論(0)  編輯  收藏 所屬分類: 數據庫

          主站蜘蛛池模板: 沁阳市| 云阳县| 托克逊县| 旬阳县| 苏尼特左旗| 昌图县| 封丘县| 涿州市| 镇巴县| 木兰县| 班戈县| 五寨县| 松原市| 行唐县| 通渭县| 永吉县| 霍山县| 青冈县| 崇明县| 西乌珠穆沁旗| 蕲春县| 东乡| 永兴县| 新晃| 凭祥市| 沿河| 江川县| 白山市| 阳春市| 游戏| 石狮市| 伊宁市| 邵武市| 虞城县| 梁平县| 大渡口区| 高邮市| 乌兰察布市| 宁海县| 襄垣县| 同江市|