保证一个用户已选取的记录不被其他用户选取
问题描述:
用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
保证一个用户已选取的记录不被其他用户选取相关推荐
- linux创建用户已存在哪里,解决linux下创建用户时出现 Creating mailbox file: 文件已存在...
原来linux下添加用户后,会在系统里自动加一个邮箱(系统邮箱),路径是:/var/spool/mail/用户名. 可以直接用命令#rm -rf /var/spool/mail/用户名 这样就可以再次 ...
- 实现一个用户取过的数据不被其他用户取到
实现一个用户取过的数据不被其他用户取到: 问题: 在用ADO访问数据库时,从一个表中取一定的记录(比如20行),取出后在程序中使用,使用完后删除掉记录(不用更新或删除记录).在多用户操作下(每个用户采 ...
- 具有用户已读状态功能的公告(3):一键已读所有公告
文章目录 1 摘要 2 解决方案 方案一 方案二 方案三 3 结论 1 摘要 关于公告这一系列的博客: 具有用户已读状态功能的公告(1):数据库设计 具有用户已读状态功能的公告(2):用户查询公告列表 ...
- Win11本地用户和组怎么管理?Win11创建用户管理员的方法
Win11本地用户和组怎么管理?我们都知道电脑的本地用户和组,但是很少用户会去管理用户或进行设置,针对这一情况,将为大家带来Win11创建用户管理员的方法. 这些系统重装的方法可以看看 1.首先,按键 ...
- linux用户在哪个文件夹,LINUX中用命令成功建立一个用户后信息会记录在哪个文件中...
LINUX中用命令成功建立一个用户后信息会记录在哪个文件中 发布时间:2007-07-28 10:14:57来源:红联作者:MPiops 增加用户帐号后 新建用户的命令十分简单,在命令行下使用 use ...
- 用C语言做一个公共自行车租赁系统:要求能够提供公共自行车的租赁和管理,能够记录用户的租车记录和时间,能够生成租车报告。
这是一个比较复杂的项目,需要多方面的知识和技能,包括C语言编程.数据结构.算法等.下面是一个简单的思路,供您参考: 定义数据结构 首先需要定义数据结构,包括自行车.用户.租车记录等,例如: // 自行 ...
- UWP DEP0700: 应用程序注册失败。[0x80073CF9] 另一个用户已安装此应用的未打包版本。当前用户无法将该版本替换为打包版本。...
原文:UWP DEP0700: 应用程序注册失败.[0x80073CF9] 另一个用户已安装此应用的未打包版本.当前用户无法将该版本替换为打包版本. 最近电脑抽风,我在[应用程序和功能]中重置了以下我 ...
- 卸载虚拟机出现用户已存在的错误_BATJ面试必会|Jvm 虚拟机篇
每天给你诚意满满的干货 作者:CyC2018出自:https://github.com/CyC2018 目录 一.运行时数据区域 程序计数器 Java 虚拟机栈 本地方法栈 堆 方法区 运行时常量池 ...
- 事务(进程 ID )与另一个进程已被死锁在 lock 资源上,且该事务已被选作死锁牺牲品。请重新运行该事务...
其实所有的死锁最深层的原因就是一个:资源竞争 表现一: 一个用户A 访问表A(锁住了表A),然后又访问表B 另一个用户B 访问表B(锁住了表B),然后企图访问表A 这时用户A由于用户B ...
最新文章
- CamVox:一种低成本、高精度的激光雷达辅助视觉SLAM系统
- 【数据结构】二分查找
- rediscluster全局数据_redis迁移,从redis cluster集群迁移数据到另外一个redis cluster集群...
- oracle恢复某个表的数据库,如何从rman的全备份中恢复一张表?
- VMware Workstation 与 Hyper-V 不兼容
- OGNL是Object-Graph Navigation Language
- JAVA面试题(part4)--控制跳转语句
- 整合mybatis3.2.2跟spring3.0.1
- java笔试题_公司真题 | 用友2018秋招Java笔试题(四)
- abaqus dat文件 matlab_提升Abaqus求解效率的七种武器
- MVC 下拉列表三级联动
- 路径规划算法:A*算法 - 附代码
- enote笔记语言(2)(ver0.2)
- Google地图开发总结
- JAVA设计模式——享元模式
- 【JavaScript-移动端常用事件】了解移动端touch触摸事件
- 宿主机和docker容器之间的文件拷贝
- fopen 和它的读写标识 r、r+、rb+、rt+、w+.....
- mybatis整合sqlite
- 华兴证券:混合云原生架构下的 Kitex 实践
热门文章
- MVC下实现LayUI分页的Demo
- C# FTP操作类库
- 2010年安大计算机录取名单,2021安徽大学考研拟录取名单已公布
- php动态添加查询,php动态添加url查询参数的方法,php动态url参数_PHP教程
- 2020mysql安装教程_2020MySQL安装图文教程
- SQL Server死锁诊断--同一行数据在不同索引操作下引起的死锁
- [转] 深入理解React 组件状态(State)
- 奥迪坚SVRM(Screen-Voice Recording Manager)录屏软件正式发布
- spark集群详细搭建过程及遇到的问题解决(四)
- VS2013配置pro*C/C++开发环境