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