Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/sql-server-2008/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server 2008 锁定存储过程_Sql Server 2008_Stored Procedures_Concurrency - Fatal编程技术网

Sql server 2008 锁定存储过程

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 ... 也就是

我有一个包含select和update的存储过程。我想防止多个用户同时执行它,因此我不会根据错误的选择进行更新。 我怎么锁它?
我读过各种解决方案(事务隔离,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可能由于死锁而被杀死。

您可以添加更新和选择命令吗?您可以添加更新和选择命令吗?