第一章 SQLserver锁表与解锁

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

上一篇:android版txt电子阅读器(一)


下一篇:EF MySql 连接错误