这样锁定会不会出现同时读取一条记录的情况?怎么改?
下面sql语句 获取第一条数据后,马上将该条数据的lockedstatus 位置为1来防止其它人读取,但实际运行中我发现还是有同时读取的情况,用什么锁可以做到
--开始事务
begin tran
--获取第一条数据的id
select @cid=PK_CustomerId from T_CustomerData where PK_CustomerId in ( select top 1 PK_CustomerId from T_CustomerData where FK_ProjectId=@ProjectId and LockedStatus=0)
//更新该条数据的lockedstatus位
update T_CustomerData set LockedStatus=1 where PK_CustomerId=@cid
//获取该条数据
select * from T_CustomerData where PK_CustomerId=@cid
commit tran
问题点数:0、回复次数:9Top
1 楼yjdn(人形机器)回复于 2005-06-02 18:44:46 得分 0
读取数据是共享所,是可以让别人读到的,
排它锁就不允许别人操作Top
2 楼duanduan1122(俺村俺帅!!!)回复于 2005-06-02 18:59:07 得分 0
1.一个数据上可以加任何数量的共享锁
2。但是一个数据上只能加一把独占锁。Top
3 楼dfcheng(飞翔鱼)回复于 2005-06-02 19:16:17 得分 0
帮我改改吧Top
4 楼dfcheng(飞翔鱼)回复于 2005-06-02 21:03:28 得分 0
邹建大哥呢Top
5 楼dfcheng(飞翔鱼)回复于 2005-06-03 10:44:24 得分 0
顶一下Top
6 楼bflovesnow()回复于 2005-06-03 14:10:26 得分 0
hehe.Top
7 楼dfcheng(飞翔鱼)回复于 2005-06-03 15:09:37 得分 0
he什么 ,帮忙呀Top
8 楼wyb0026(小小)回复于 2005-06-03 15:42:15 得分 0
--试一下这个在from 子句加入with(XLOCK)
begin tran
--获取第一条数据的id
select @cid=PK_CustomerId from T_CustomerData with(XLOCK) where PK_CustomerId in ( select top 1 PK_CustomerId from T_CustomerData with(XLOCK) where FK_ProjectId=@ProjectId and LockedStatus=0)
//更新该条数据的lockedstatus位
update T_CustomerData set LockedStatus=1 where PK_CustomerId=@cid
//获取该条数据
select * from T_CustomerData where PK_CustomerId=@cid
commit tran
Top
9 楼dfcheng(飞翔鱼)回复于 2005-06-03 16:25:28 得分 0
能不能只用行级锁Top




