計算機學習積累

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

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

          問題描述:

          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 閱讀(198) 評論(0)  編輯  收藏 所屬分類: 數據庫

          主站蜘蛛池模板: 宣威市| 额尔古纳市| 宕昌县| 宁河县| 那坡县| 白朗县| 房产| 荔波县| 涟源市| 华阴市| 加查县| 盐边县| 来凤县| 勃利县| 南郑县| 太仓市| 陇川县| 沂南县| 祁连县| 大石桥市| 忻城县| 察哈| 玉门市| 洞头县| 焦作市| 崇礼县| 伊春市| 景德镇市| 如东县| 启东市| 济源市| 迭部县| 大化| 托克逊县| 张家口市| 林口县| 中牟县| 孝昌县| 蒲江县| 扬中市| 麟游县|