读取表时使用更新锁,而不使用共享锁,并将锁一直保留到语句或事务的结束。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部分那这样读到的数据不就相同了吗?
欢迎大家来讨论.
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部分那这样读到的数据不就相同了吗?
欢迎大家来讨论.
都在事务里面.忘写了.
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