set ANSI_NULLS ON
set QUOTED_IDENTIFIER ON
GO
ALTER proc [dbo].[test1]
as
declare @thisID as bigint
BEGIN TRANSACTION
SELECT top 1 @thisID=id FROM tab1 ROWLOCK WHERE flag=0
update tab1 set flag=1 where id=@thisID
select * from tab1 where id=@thisID
COMMIT TRANSACTION多个客户端同时访问数据库,本意是让一条记录只被一个客户端读取,但有时还会出现一条记录同时被两个或多个客户端读取?怎样改进呢?谢谢!!

解决方案 »

  1.   

    SELECT top 1 @thisID=id FROM tab1 with(xlock,pagLOCK) WHERE flag=0 
      

  2.   


    SELECT top 1 @thisID=id FROM tab1 with(xlock,pagLOCK) WHERE flag=0 
      

  3.   

    XLOCK 指定采用排他锁并保持到事务完成。排他锁(X 锁)可以防止并发事务对资源进行访问。使用排他锁(X 锁)时,任何其他事务都无法修改数据;仅在使用 NOLOCK 提示或未提交读隔离级别时才会进行读取操作。
      

  4.   

    SELECT top 1 @thisID=id FROM tab1 with(HOLDLOCK) WHERE flag=0