Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sql-server-2005/2.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 2005 如何在操作期间锁定表_Sql Server 2005 - Fatal编程技术网

Sql server 2005 如何在操作期间锁定表

Sql server 2005 如何在操作期间锁定表,sql-server-2005,Sql Server 2005,我想在执行存储过程时锁定一个表 这是个好办法吗 CREATE PROCEDUE sp_test @tableName nvarchar(128) AS DECLARE @sql nvarchar(MAX) = 'SELECT * FROM ' + @tableName + 'WITH TABLOCK' EXEC @sql -- DO my operations -- How Do I release the lock? or does it get release when the exe

我想在执行存储过程时锁定一个表

这是个好办法吗

CREATE PROCEDUE sp_test
@tableName nvarchar(128)
AS

DECLARE @sql nvarchar(MAX) = 'SELECT * FROM ' + @tableName + 'WITH TABLOCK'
EXEC @sql

-- DO my operations

-- How Do I release the lock? or does it get release when the execution is done
还是有更好的方法来实现这一点


谢谢

您可以在过程调用开始时将表上的特定锁取出

如果要防止对表进行数据修改,可以使用IX锁

SET XACT_ABORT ON;
BEGIN TRAN
    SELECT * FROM <<TABLENAME>> WITH(UPDLOCK, SERIALIZABLE) WHERE 1=0;
    -- DO STUFF
    SELECT * FROM sys.dm_tran_locks WHERE request_session_id = @@spid;
COMMIT TRAN
如果要阻止任何其他进程访问数据,可以使用X锁。当然,这并不能阻止任何未提交的读取

SET XACT_ABORT ON;
BEGIN TRAN
    DELETE FROM <<TABLENAME>> WITH(XLOCK, TABLOCK, SERIALIZABLE) WHERE 1=0;
    -- DO STUFF 
    SELECT * FROM sys.dm_tran_locks WHERE request_session_id = @@spid;
COMMIT TRAN

当事务提交/回滚时,锁被释放

我并不是说您不需要这个,但是如果进程经常被命中,我希望会发生严重的锁争用。你能详细说明你为什么需要它吗?它不应该经常被点击,很可能是一次。我们有一个存储过程,可以对特定表进行更改跟踪。当调用该过程时,我们要锁定表,这样就没有人可以在表上执行DML操作。一旦程序完成,我们要释放锁。执行该过程不会花费很长时间。对于X锁,为什么要执行删除?你不能做一个选择吗?