第一章 SQLserver锁表与解锁

作者:管理员 更新时间:2024-07-29 22:00

某些情况下,SQLserver的表会被锁住,比如某个会话窗口有数据一直没提交,窗口又没关闭,这时表就会被锁住,其他任何连接查询表数据时都不会返回,这时需要手工杀掉产生死锁的会话ID,才能恢复正常。

一、锁表

#1.方式一:其他事务可以读取表,但不能更新删除

SELECT * FROM table WITH (HOLDLOCK)

#2.方式二:其他事务不能读取表,更新和删除

SELECT * FROM table WITH (TABLOCKX)

二、查看被锁表

select request_session_id spid,OBJECT_NAME(resource_associated_entity_id) tableName

from sys.dm_tran_locks where resource_type='OBJECT';

# 这时会出现两列数据

第一列 --spid 锁表进程

第二列 --tableName 被锁表名

三、解锁

declare @spid int

Set @spid = 57 --锁表进程

declare @sql varchar(1000)

set @sql='kill '+cast(@spid as varchar)

exec(@sql)

四、查询出死锁的SPID

select blocked

from (select * from sysprocesses where blocked>0 ) a

where not exists(select * from (select * from sysprocesses where blocked>0 ) b

where a.blocked=spid)

五、输出引起死锁的操作

DBCC INPUTBUFFER (@spid)

六、查询当前进程数

select count(-1) from sysprocesses

where dbid in (select dbid from sysdatabases where name like '%telcount%');

七、查询不锁表

如果不想锁表,那就再表名或别名后面加上WITH(NOLOCK)

#示例:

SELECT Id FROM dbo.T_Table WITH(NOLOCK) WHERE Id = 1


来源:亦有软件
软件产品Eysln Software Product
亦有公告Eysln Notice
案例中心Eysln Template
知识库Eysln Knowledge Base
工具箱Eysln Toolkit Online