計算機學習積累

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

          使用事務與鎖,實現一個用戶取過的數據不被其他用戶取到(轉鄒?。?/a>

          問題描述:

          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)  編輯  收藏 所屬分類: 數據庫

          主站蜘蛛池模板: 自治县| 梓潼县| 广饶县| 南岸区| 广安市| 收藏| 湛江市| 子洲县| 同江市| 沅江市| 麦盖提县| 临汾市| 南汇区| 上思县| 安化县| 罗山县| 扶绥县| 清新县| 炎陵县| 镇平县| 萝北县| 达日县| 班玛县| 浦东新区| 文山县| 梨树县| 连山| 永修县| 黄龙县| 错那县| 塘沽区| 永定县| 蓝山县| 湾仔区| 东阿县| 工布江达县| 通江县| 南江县| 桃源县| 万年县| 惠州市|