程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 數據庫知識 >> SqlServer數據庫 >> 關於SqlServer >> sqlserver 使用事務與鎖,實現一個用戶取過的數據不被其他用戶取

sqlserver 使用事務與鎖,實現一個用戶取過的數據不被其他用戶取

編輯:關於SqlServer
 

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

 


問題解決:


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

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

下面是具體的解決示例

 


1. 建立測試環境


USE tempdb

GO

 

CREATE TABLE dbo.tb(

id int identity(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條數據

 

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

 

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

 
  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved