Sqlserver死锁怎么解决?主要有这些实用技巧:1.用查询分析器找出死锁进程,用kill命令结束它;2.调整SQL语句顺序,让所有事务按同样的顺序访问表;3.缩短事务时间,别让锁持太久;4.降低隔离级别,从READ COMMITTED改成READ UNCOMMITTED;5.用行级锁代替表锁;6.定期检查索引,优化查询速度。这些方法简单有效,能大大减少死锁。
CSDN博客用户分享
死锁解决方法:1、结束进程:通过SQL查询死锁进程,然后用kill命令结束死锁进程。2、调整访问顺序:所有并发事务按相同顺序访问资源。3、减小锁持有时间:SQL语句尽量精简,事务越短越好。4、降低隔离级别:READ COMMITTED降为READ UNCOMMITTED。5、使用绑定连接:sp_configure 'user options', 1;RECONFIGURE;。6、死锁超时时间:sp_configure 'awe enabled', 1;RECONFIGURE;。这几个方法我都用过,特别有效。
博客园实际案例
我们遇到死锁,先用这个SQL查死锁:SELECT session_id,command, a.text, b.start_time, b.status, b.hostname, b.blocking_session_id FROM sys.dm_exec_requests r INNER JOIN sys.dm_exec_connections c ON r.session_id=c.session_id CROSS APPLY sys.dm_exec_sql_text(r.sql_handle)a INNER JOIN sys.dm_exec_sessions b ON r.session_id=b.session_id。然后kill掉blocking_session_id。长期解决,加索引,改事务隔离级别为快照隔离,效果很好。别忘了用Trace Flag 1222跟踪死锁详情。
知乎高赞回答
实用技巧:1. 规范化访问顺序,比如表A和B,总先锁A再锁B。2. 减少事务粒度,只锁需要的行。3. 用NOLOCK提示避免共享锁,但小心脏读数据。4. 监控死锁,用SQL Profiler或扩展事件捕获。5. 优化查询,加合适索引。6. 分离读写,读操作用从库。我的项目里这样改,死锁率降到几乎零。
简书经验帖
死锁排查三板斧:1. 查看系统进程列表,找出阻塞进程kill掉。2. 开启死锁跟踪:DBCC TRACEON (1222, -1)。3. 用Activity Monitor看锁链。预防:统一锁顺序,缩短事务,行锁为主。实际测试,改了SQL顺序,死锁没了。
Stack Overflow中文翻译摘录
最佳实践:Always access tables in the same order for every transaction. Keep transactions short and sweet. Do not submit user input directly to the database. Use query hints sparingly like NOLOCK. Use stored procedures whenever possible. Finally, set the lock timeout to a reasonable value to avoid long waits.
FAQ
Q: 死锁怎么快速查出来?
A: 用SELECT * FROM sys.dm_tran_locks查锁,用sp_who2看阻塞,或者开Trace Flag 1222看日志。
Q: NOLOCK安全吗?
A: 不完全安全,会读到脏数据,但对报告查询OK,关键业务别用。
Q: 快照隔离有副作用吗?
A: 会多用tempdb空间,更新多时可能有版本膨胀,但对死锁超级有效。
Q: 索引怎么帮解决死锁?
A: 好索引让查询快,锁时间短,自然死锁少。