某些情况下,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
第一章 SQLserver锁表与解锁