Sql server 2008 锁定存储过程
我有一个包含select和update的存储过程。我想防止多个用户同时执行它,因此我不会根据错误的选择进行更新。 我怎么锁它?Sql server 2008 锁定存储过程,sql-server-2008,stored-procedures,concurrency,Sql Server 2008,Stored Procedures,Concurrency,我有一个包含select和update的存储过程。我想防止多个用户同时执行它,因此我不会根据错误的选择进行更新。 我怎么锁它? 我读过各种解决方案(事务隔离,xlock),但我还没有弄清楚我真正想要的是什么,以及如何做到这一点。最简单的方法是忘记数据锁,而是通过代码控制访问 BEGIN TRY EXEC sp_getapplock ... SELECT ... UPDATE ... EXEC sp_releaseapplock END TRY ... 也就是
我读过各种解决方案(事务隔离,xlock),但我还没有弄清楚我真正想要的是什么,以及如何做到这一点。最简单的方法是忘记数据锁,而是通过代码控制访问
BEGIN TRY
EXEC sp_getapplock ...
SELECT ...
UPDATE ...
EXEC sp_releaseapplock
END TRY
...
也就是说,使用OUTPUT子句和明智地使用ROWLOCK、UPDLOCK等语句,更新和选择很有可能是一条语句。最简单的方法是忘记数据锁,而是通过代码控制访问
BEGIN TRY
EXEC sp_getapplock ...
SELECT ...
UPDATE ...
EXEC sp_releaseapplock
END TRY
...
也就是说,使用OUTPUT子句和明智地使用ROWLOCK,UPDLOCK很有可能使用SELECT
查询中的表提示,UPDATE和SELECT可以是一条语句:
CREATE TABLE [X]([x] INT NOT NULL)
GO
INSERT [X]([x]) SELECT 0
GO
CREATE PROCEDURE [ATOMIC]
AS
BEGIN
BEGIN TRAN
DECLARE @x INT = (
SELECT [x]
FROM [X] (XLOCK)
) + 1
UPDATE [X] SET [x] = @x
COMMIT TRAN
END
GO
然后可以通过运行
EXEC [ATOMIC]
GO 10000
同时从不同的会议。您可以使用
SELECT [x] FROM [X]
该值应该正好是您运行的会话数的10000倍。如果该数字小于预期值,则您没有原子读写,或者某些SPID可能由于死锁而被终止。使用选择
查询中的表提示:
CREATE TABLE [X]([x] INT NOT NULL)
GO
INSERT [X]([x]) SELECT 0
GO
CREATE PROCEDURE [ATOMIC]
AS
BEGIN
BEGIN TRAN
DECLARE @x INT = (
SELECT [x]
FROM [X] (XLOCK)
) + 1
UPDATE [X] SET [x] = @x
COMMIT TRAN
END
GO
然后可以通过运行
EXEC [ATOMIC]
GO 10000
同时从不同的会议。您可以使用
SELECT [x] FROM [X]
该值应该正好是您运行的会话数的10000倍。如果数字小于预期,则您没有原子读写,或者某些SPID可能由于死锁而被杀死。您可以添加更新和选择命令吗?您可以添加更新和选择命令吗?