问题描述
一个人读取记录1后,其他人只能读取2或后面的记录,不知道如何实现?
解决方案
解决方案二:
使用数据库的查询锁
解决方案三:
那数据库的并发特性还有什么价值?
解决方案四:
http://blog.csdn.net/zjcxc/archive/2006/08/28/1133843.aspx1.建立测试环境USEtempdbGOCREATETABLEdbo.tb(idintidentity(1,1),namenvarchar(128))INSERTtb(name)SELECTTOP100nameFROMsyscolumnsGO2.新建窗口模拟第1个用户--查询窗口发出下面的查询语句BEGINTRAN--事务不提交或者回滚,以保持锁不释放SETROWCOUNT20SELECT*FROMtbWITH(UPDLOCK,READPAST)--UPDLOCK让锁保留到事务结束,READPAST跳过已经锁定的数据3.新建窗口模拟第2个用户(语句与第1个用户一样,只是在另一个连接中执行)--查询窗口发出下面的查询语句BEGINTRAN--事务不提交或者回滚,以保持锁不释放SETROWCOUNT20SELECT*FROMtbWITH(UPDLOCK,READPAST)--UPDLOCK让锁保留到事务结束,READPAST跳过已经锁定的数据4.结果你会看到查询窗口1列出了前20条数据查询窗口1列出了21-40条数据这样就实现了不同的用户取不同数据的需求.注:处理完成后,删除记录,然后提交事务就可以了.
解决方案五:
学习
解决方案六:
应该可以利用权限的吧
解决方案七:
两种方案:1,在被访问的表中添加字段,用来标记该记录当前是否被占用,程序读取前先检查该字段的状态,举例:可以用一个字符型的字段,在有用户访问时写上当前用户的ID,访问结束时再将该位置清空。2,在数据库创建一个“当前记录访问表”,记录“用户ID,正在使用的记录ID号”,程序里产生访问请求的时候先检查待访问的记录ID在不在该表内,不在则开始访问并同时向“当前记录访问表”增加一条新的记录,记录当前用户正在使用该记录ID,当用户访问结束时再将该条记录删除。如果楼主你的程序的用户每个人都有各自的数据库访问账户的话,可以参照“jinjazz(近身剪)”的方法进行访问加锁(我估计你不是这样做的吧),但是如果你的程序采用统一的数据库访问账户,“jinjazz(近身剪)”也不能满足你的要求,因为这种情况下,所有用户事实上都是以相同的一个数据库身份来读取数据的,加锁就没有任何意义了,这时你可以考虑使用我说的两种方案。
解决方案八:
我也测试过了,用1,在被访问的表中添加字段,用来标记该记录当前是否被占用,程序读取前先检查该字段的状态,举例:可以用一个字符型的字段,在有用户访问时写上当前用户的ID,访问结束时再将该位置清空。2,在数据库创建一个“当前记录访问表”,记录“用户ID,正在使用的记录ID号”,程序里产生访问请求的时候先检查待访问的记录ID在不在该表内,不在则开始访问并同时向“当前记录访问表”增加一条新的记录,记录当前用户正在使用该记录ID,当用户访问结束时再将该条记录删除。上面两种方法有时候还是会出现同时打开一个记录的情况
解决方案九:
收藏
解决方案十:
学习之中
解决方案十一:
MARK
解决方案十二:
up