如果data表里有N条数据存储过程:declare @tmpId bigint
BEGIN TRANSACTIONSELECT top 1 @tmpId=Id FROM data rowlock WITH (tablockx) WHERE dstatus=0
update data set dstatus=1 where Id=@tmpId
select * from data where Id=@tmpIdCOMMIT TRANSACTION如果就使用 rowlock with(tablockx) 是否会出现脏读,重复读?(多个进程同时调用这个存储过程)谢谢!(只有23分了,哭~~~~~~)

解决方案 »

  1.   

    sqlserver默认的是已提交读。你那个select加表锁没用的。执行完后表锁就释放了。
    直接UPDATE就是了。判断下@@ROWCOUNT
      

  2.   

    如果数据库有10000行数据,有两个客户端在读取数据(不允许重复读取),如果不加锁,直接update,读取重复率很高的
      

  3.   

    你UPDATE的时候会有独占锁的 不必要担心
      

  4.   


    SELECT top 1 @tmpId=Id FROM data rowlock WITH (tablockx) WHERE dstatus=0
    去掉
    SELECT top 1 @tmpId=Id FROM data WHERE dstatus=0
    11个客户端去读共计1300个数据,有30几条读重复了,有几条甚至读了3次