日期:2014-05-17  浏览次数:20961 次

请问 WITH ( UPDLOCK, HOLDLOCK )是什么用法
Asp.net的Membership表的CreateUser存储过程中为什么要加 WITH ( UPDLOCK, HOLDLOCK )锁呢?

另外with这里是个函数吗?后面可以跟多个参数? 能讲下with()的用法吗


IF (@UniqueEmail = 1)
BEGIN
IF (EXISTS (SELECT *
FROM dbo.aspnet_Membership m WITH ( UPDLOCK, HOLDLOCK )
WHERE ApplicationId = @ApplicationId AND LoweredEmail = LOWER(@Email)))
BEGIN
SET @ErrorCode = 7
GOTO Cleanup
END
END

------解决方案--------------------
引用:
Quote: 引用:

这个其实就是查询提示,你可以直接在一个sql语句的级别去定义锁,

比如updlock:是获取一个更新锁
holdlock:在一个事务中的sql语句,一直持有这个锁,一般是S锁,直到事务结束为止,其实就类似于REPEATABLE READ,SERIALIZABLE隔离级别

那这个存储过程为什么要同时加上这两个锁呢,直接加一个S锁不行吗?


直接加s锁不行,因为s锁在默认情况下,语句运行完,就自动释放s锁,就会有有问题,所以加上了holdlock,另外,这个存储过程要达到,在同一时间,只有一个存储过程可以直接运行,而其他的存储过程都要等待,所以加了updlock,因为s锁,是共享锁,所以不会阻塞其他的存储过程,而updlock在某个会话持有后,其他的会话都必须要等待。