SqlServer 要了解死锁必须学会制造死锁
2021/6/8 19:22:22
本文主要是介绍SqlServer 要了解死锁必须学会制造死锁,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!
一、创建死锁
1、创建两个表
CREATE TABLE Tbl1 (id INT NOT NULL PRIMARY KEY CLUSTERED, col INT) CREATE TABLE Tbl2 (id INT NOT NULL PRIMARY KEY CLUSTERED, col INT REFERENCES dbo.Tbl1(id))
2、在新建查询1中(以下称 Session 1)执行事务
BEGIN TRAN INSERT dbo.Tbl1 (id, col) VALUES (2, 999)
3、在新建查询2中(以下称 Session 2)执行事务
BEGIN TRAN INSERT dbo.Tbl2 (id, col) VALUES (111, 2)
4、在 Session 1 中执行插入语句
INSERT dbo.Tbl2 (id, col) VALUES (111, 555)
5、报死锁错误
二、追究溯源——是谁导致了死锁?
SELECT es.session_id, database_name = DB_NAME(er.database_id), er.cpu_time, er.reads, er.writes, er.logical_reads, er.total_elapsed_time, login_name, er.status, blocking_session_id, wait_type, wait_time, transaction_id, individual_query = SUBSTRING (qt.text, er.statement_start_offset/2, (CASE WHEN er.statement_end_offset = -1 THEN LEN(CONVERT(NVARCHAR(MAX), qt.text)) * 2 ELSE er.statement_end_offset END - er.statement_start_offset)/2), parent_query = qt.text, program_name, host_name, nt_domain, start_time FROM sys.dm_exec_requests er INNER JOIN sys.dm_exec_sessions es ON er.session_id = es.session_id CROSS APPLY sys.dm_exec_sql_text(er.sql_handle)as qt WHERE es.session_id > 50 AND es.session_Id NOT IN (@@SPID) ORDER BY 1, 2
执行后,有如下结果,包括错误的语句等详细信息,找到了死锁的根源
三、Kill DeadLock ! ——请确保业务安全的情况下进行
kill 57 --Kill session_id
四、避免死锁及语句优化
还没想好,需要整理,日后补充
这篇关于SqlServer 要了解死锁必须学会制造死锁的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!
- 2024-01-08Docker下的SqlServer发布订阅启用
- 2023-06-05Docker安装MS SQL Server并使用Navicat远程连接
- 2023-05-25深入浅出 SQL Server CDC 数据同步
- 2023-05-12通过空间占用和执行计划了解SQL Server的行存储索引
- 2023-04-24以SQLserver为例的Dapper详细讲解
- 2022-11-30SQL server高级函数查询
- 2022-11-26SQL SERVER数据库服务器CPU不能全部利用原因分析
- 2022-11-21SQL Server 时间算差值/常用函数
- 2022-11-20调试Archery连接SQL Server提示驱动错误
- 2022-10-22SQL Server 完整、差异备份+完整、差异还原(详细讲解,规避错误)