死锁排查
死锁超时时间
事务超时时间
连接超时时间
查看死锁的表
selectrequest_session_id spid,OBJECT_NAME(resource_associated_entity_id) tableNamefromsys.dm_tran_lockswhereresource_type='OBJECT'
显示死锁的相关信息
exec sp_who2 354
查看导致死锁的sql
通过这条语句,可以查到导致死锁的sql语句,然后判断出来
SELECT
es.session_id,
database_name = DB_NAME(er.database_id),
er.cpu_time,
er.reads,
er.writes,
er.logical_reads,
login_name,
er.status,
blocking_session_id,
wait_type,
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
死锁检测
死锁检测的机制是什么,为什么下面这个案例没有被检测出来。
死锁案例
读写锁冲突,最后导致连接超时。
死锁原因
数据库连接A,先开启事务,并执行了表C的insert语句(假设此时id为3),然后此时没有提交数据。此时数据库连接A 会给表C中id值为3的记录加上写锁。
数据库连接B,根据表C的id(此时为3)查询,这时候会发现表C中id值为3的记录上有写锁。此时连接A处于 等待状态,需要数据库连接A提交 或者回滚事务才能继续操作。、
因为程序做了数据库连接A的操作之后,需要整改方法执行完毕才能提交事务。而在这个过程中,又执行了数据库连接B的操作,倒是数据库连接A无法提交事务。
