问题描述:
  用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

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

  1. linux创建用户已存在哪里,解决linux下创建用户时出现 Creating mailbox file: 文件已存在...

    原来linux下添加用户后,会在系统里自动加一个邮箱(系统邮箱),路径是:/var/spool/mail/用户名. 可以直接用命令#rm -rf /var/spool/mail/用户名 这样就可以再次 ...

  2. 实现一个用户取过的数据不被其他用户取到

    实现一个用户取过的数据不被其他用户取到: 问题: 在用ADO访问数据库时,从一个表中取一定的记录(比如20行),取出后在程序中使用,使用完后删除掉记录(不用更新或删除记录).在多用户操作下(每个用户采 ...

  3. 具有用户已读状态功能的公告(3):一键已读所有公告

    文章目录 1 摘要 2 解决方案 方案一 方案二 方案三 3 结论 1 摘要 关于公告这一系列的博客: 具有用户已读状态功能的公告(1):数据库设计 具有用户已读状态功能的公告(2):用户查询公告列表 ...

  4. Win11本地用户和组怎么管理?Win11创建用户管理员的方法

    Win11本地用户和组怎么管理?我们都知道电脑的本地用户和组,但是很少用户会去管理用户或进行设置,针对这一情况,将为大家带来Win11创建用户管理员的方法. 这些系统重装的方法可以看看 1.首先,按键 ...

  5. linux用户在哪个文件夹,LINUX中用命令成功建立一个用户后信息会记录在哪个文件中...

    LINUX中用命令成功建立一个用户后信息会记录在哪个文件中 发布时间:2007-07-28 10:14:57来源:红联作者:MPiops 增加用户帐号后 新建用户的命令十分简单,在命令行下使用 use ...

  6. 用C语言做一个公共自行车租赁系统:要求能够提供公共自行车的租赁和管理,能够记录用户的租车记录和时间,能够生成租车报告。

    这是一个比较复杂的项目,需要多方面的知识和技能,包括C语言编程.数据结构.算法等.下面是一个简单的思路,供您参考: 定义数据结构 首先需要定义数据结构,包括自行车.用户.租车记录等,例如: // 自行 ...

  7. UWP DEP0700: 应用程序注册失败。[0x80073CF9] 另一个用户已安装此应用的未打包版本。当前用户无法将该版本替换为打包版本。...

    原文:UWP DEP0700: 应用程序注册失败.[0x80073CF9] 另一个用户已安装此应用的未打包版本.当前用户无法将该版本替换为打包版本. 最近电脑抽风,我在[应用程序和功能]中重置了以下我 ...

  8. 卸载虚拟机出现用户已存在的错误_BATJ面试必会|Jvm 虚拟机篇

    每天给你诚意满满的干货 作者:CyC2018出自:https://github.com/CyC2018 目录 一.运行时数据区域 程序计数器 Java 虚拟机栈 本地方法栈 堆 方法区 运行时常量池 ...

  9. 事务(进程 ID )与另一个进程已被死锁在 lock 资源上,且该事务已被选作死锁牺牲品。请重新运行该事务...

    其实所有的死锁最深层的原因就是一个:资源竞争 表现一:     一个用户A 访问表A(锁住了表A),然后又访问表B     另一个用户B 访问表B(锁住了表B),然后企图访问表A 这时用户A由于用户B ...

最新文章

  1. CamVox:一种低成本、高精度的激光雷达辅助视觉SLAM系统
  2. 【数据结构】二分查找
  3. rediscluster全局数据_redis迁移,从redis cluster集群迁移数据到另外一个redis cluster集群...
  4. oracle恢复某个表的数据库,如何从rman的全备份中恢复一张表?
  5. VMware Workstation 与 Hyper-V 不兼容
  6. OGNL是Object-Graph Navigation Language
  7. JAVA面试题(part4)--控制跳转语句
  8. 整合mybatis3.2.2跟spring3.0.1
  9. java笔试题_公司真题 | 用友2018秋招Java笔试题(四)
  10. abaqus dat文件 matlab_提升Abaqus求解效率的七种武器
  11. MVC 下拉列表三级联动
  12. 路径规划算法:A*算法 - 附代码
  13. enote笔记语言(2)(ver0.2)
  14. Google地图开发总结
  15. JAVA设计模式——享元模式
  16. 【JavaScript-移动端常用事件】了解移动端touch触摸事件
  17. 宿主机和docker容器之间的文件拷贝
  18. fopen 和它的读写标识 r、r+、rb+、rt+、w+.....
  19. mybatis整合sqlite
  20. 华兴证券:混合云原生架构下的 Kitex 实践

热门文章

  1. MVC下实现LayUI分页的Demo
  2. C# FTP操作类库
  3. 2010年安大计算机录取名单,2021安徽大学考研拟录取名单已公布
  4. php动态添加查询,php动态添加url查询参数的方法,php动态url参数_PHP教程
  5. 2020mysql安装教程_2020MySQL安装图文教程
  6. SQL Server死锁诊断--同一行数据在不同索引操作下引起的死锁
  7. [转] 深入理解React 组件状态(State)
  8. 奥迪坚SVRM(Screen-Voice Recording Manager)录屏软件正式发布
  9. spark集群详细搭建过程及遇到的问题解决(四)
  10. VS2013配置pro*C/C++开发环境