读取表时使用更新锁,而不使用共享锁,并将锁一直保留到语句或事务的结束。UPDLOCK 的优点是允许您读取数据(不阻塞其它事务)并在以后更新数据,同时确保自从上次读取数据后数据没有被更改。例:
SELECT @CNT=CNT FROM ACCEPT_NO_MST WITH (UPDLOCK,HOLDLOCK) WHERE  DT=@DT AND [USER_ID]=@USER_ID UPDATE ACCEPT_NO_MST SET CNT=@CNT  WHERE DT=@DT AND [USER_ID]=@USER_ID 
假如我有两个线程同时执行到了SELECT部分那这样读到的数据不就相同了吗?
欢迎大家来讨论.

解决方案 »

  1.   

    BEGIN TRAN   SELECT @CNT=CNT FROM ACCEPT_NO_MST WITH (UPDLOCK,HOLDLOCK) WHERE  DT=@DT AND [USER_ID]=@USER_ID UPDATE ACCEPT_NO_MST SET CNT=@CNT  WHERE DT=@DT AND [USER_ID]=@USER_ID COMMIT TRAN
    都在事务里面.忘写了.
      

  2.   


    BEGIN TRAN   SELECT @CNT=CNT FROM ACCEPT_NO_MST WITH (UPDLOCK,HOLDLOCK) WHERE  DT=@DT AND [USER_ID]=@USER_ID 
    SET @CNT=@CNT+1  UPDATE ACCEPT_NO_MST SET CNT=@CNT  WHERE DT=@DT AND [USER_ID]=@USER_ID COMMIT TRAN
      

  3.   

    当我不加WITH (UPDLOCK,HOLDLOCK)时CNT的就可能会被设置两次相同的值,但这并不是我所需要的呀!为什么为产生这种情况呀!会UPDATE两次一样的值.