死锁排查

死锁超时时间

事务超时时间

连接超时时间

查看死锁的表

  1. select
  2. request_session_id spid,
  3. OBJECT_NAME(resource_associated_entity_id) tableName
  4. from
  5. sys.dm_tran_locks
  6. where
  7. resource_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

死锁检测

死锁检测的机制是什么,为什么下面这个案例没有被检测出来。

死锁案例

读写锁冲突,最后导致连接超时。

死锁原因

  1. 数据库连接A,先开启事务,并执行了表C的insert语句(假设此时id为3),然后此时没有提交数据。此时数据库连接A 会给表C中id值为3的记录加上写锁。

  2. 数据库连接B,根据表C的id(此时为3)查询,这时候会发现表C中id值为3的记录上有写锁。此时连接A处于 等待状态,需要数据库连接A提交 或者回滚事务才能继续操作。、

  3. 因为程序做了数据库连接A的操作之后,需要整改方法执行完毕才能提交事务。而在这个过程中,又执行了数据库连接B的操作,倒是数据库连接A无法提交事务。