最近一直在查关于资源锁定的故障,期间粗浅的研究了关于sqlserver性能优化方面的知识。总结了几个在发生故障的时候,经常需要使用的工具语句,记录下来,希望下次能够用得上。
这次故障的主要原因还是事务处理,由于一个大的事务无法拆分,造成长时间的资源锁定。除了优化事务本身,减少资源的锁定时间之外,由于事务必须在白天经常执行,最后的解决方案是在数据表里设置一个标志,一旦开始事务,则设置标志位,保证其他执行事务的人无法启动,减少死锁的时间,并且友好的通知用户。
设置锁表超时时间
select @@LOCK_TIMEOUT
set LOCK_TIMEOUT -1
查看sql日志
也可以直接到日志文件中去查
exec xp_readerrorlog 0,1,NULL,NULL,'2020-11-24','2020-11-25','desc'
exec xp_readerrorlog 0
数据一致性检查
DBCC INPUTBUFFER(53)
查询正在被锁定的表
select request_session_id spid,OBJECT_NAME(resource_associated_entity_id) tableName from sys.dm_tran_locks where resource_type='OBJECT'
查询当前连接的用户
SELECT * FROM [Master].[dbo].[SYSPROCESSES] WHERE [DBID] IN (SELECT [DBID] FROM [Master].[dbo].[SYSDATABASES] WHERE NAME='****')
查询用户的连接情况
SP_WHO '用户名'
仅保留3个月内的日志(个人专用)
select * from LogError where datediff(month,dtDate,getdate())>3