zoukankan      html  css  js  c++  java
  • 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

    四、避免死锁及语句优化

    还没想好,需要整理,日后补充

  • 相关阅读:
    HDU 6370 dfs+并查集
    牛客网暑期ACM多校训练营(第六场)G
    HDU 6351暴力枚举 6354计算几何
    2018 ACM 国际大学生程序设计竞赛上海大都会赛重现赛 A,D
    2018 百度之星 初赛 第六题 HDU6349
    HDU 6336 子矩阵求和
    HDU 6333 莫队+组合数
    BZOJ 2308 莫队入门经典
    Linux系统管理第一章
    2019年7月17日
  • 原文地址:https://www.cnblogs.com/seanyan/p/14863568.html
Copyright © 2011-2022 走看看