您好, 欢迎来到 !    登录 | 注册 | | 设为首页 | 收藏本站

第一章 SQLserver锁表与解锁

bubuko 2022/1/25 18:57:20 sqlserver 字数 1786 阅读 904 来源 http://www.bubuko.com/infolist-5-1.html

某些情况下,SQLserver的表会被锁住,比如某个会话窗口有数据一直没提交,窗口又没关闭,这时表就会被锁住,其他任何连接查询表数据时都不会返回,这时需要手工杀掉产生死锁的会话ID,才能恢复正常。 一、锁表 #1.方式一:其他事务可以读取表,但不能更新删除 SELECT * FROM table W ...
某些情况下,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锁表与解锁

原文:https://www.cnblogs.com/jhno1/p/15163213.html


如果您也喜欢它,动动您的小指点个赞吧

除非注明,文章均由 laddyq.com 整理发布,欢迎转载。

转载请注明:
链接:http://laddyq.com
来源:laddyq.com
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。


联系我
置顶