日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

保证一个用户已选取的记录不被其他用户选取

發布時間:2023/12/9 编程问答 41 豆豆
生活随笔 收集整理的這篇文章主要介紹了 保证一个用户已选取的记录不被其他用户选取 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

問題描述:
  用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

總結

以上是生活随笔為你收集整理的保证一个用户已选取的记录不被其他用户选取的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。