保证一个用户已选取的记录不被其他用户选取
問題描述:
用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條數據?
使用sp_Lock查看結果
create table #temp(
?spid int,
?dbid int,
?objid int,
?IndID int,
?Type varchar(3),
?resouse varchar(20),
?Mode varchar(5),
?Status varchar(5)
)
insert #temp exec sp_lock @@spid
select spid,db_name(dbid) as 數據庫,
object_name(objid) as 對象,
索引 = (select name from sysindexes where id=objid and indid=t.indid),
Type,Resouse,Mode,Status from #temp t where dbid>5
drop table #temp
select @@version
?
轉載于:https://www.cnblogs.com/zyizyizyi/archive/2006/09/18/2497851.html
總結
以上是生活随笔為你收集整理的保证一个用户已选取的记录不被其他用户选取的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【小月电子】ALTERA FPGA开发板
- 下一篇: altera fpga 型号说明_Act