sqlserver 数据库死锁 解决心得
背景:一个客服数据库,每天不定时死锁,死锁时间很短。等到远程时死锁已经结束。
起初遇到死锁,一般都是先通过活动监视器,找到头阻塞的id,通过spid定位到机器和程序。但是这次情况比较特殊,每次死锁时间较短,不好追踪。最后想来想去还是锁的概念掌握的不够清晰,在网上又找了几篇文章,受到了启发。
首先为什么会锁,是因为 1.A事务手里拿着M1 ,需要获得M2 ,B事务手里拿着M2,需要获得M2 2,A事务如果获得某张表的共享锁 S 不释放,B事务想要update 表 会锁 。 我感觉这个客户的情况像第二种:
该语句可以查看数据库中session锁情况。
SELECT resource_type, request_mode, resource_description,request_session_id, DB_NAME(resource_database_id)as resource_database FROM sys.dm_tran_locks WHERE resource_type <> 'DATABASE'
发现有一个spid一直使用架构锁,通过这个spid 再查询分析器里过滤出 是在执行一个存储过程,对一个表的索引重建。 这个应该会对数据库的性能影响很大,并如果有用户访问这张表会造成死锁。 查询分析器里可以看到应用名称和ip地址。结束这个应用服务。之后就是继续观察,希望这次猜的没问题。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· 从HTTP原因短语缺失研究HTTP/2和HTTP/3的设计差异
· 三行代码完成国际化适配,妙~啊~