【问题标题】:Deadlock found when trying to get lock尝试获取锁时发现死锁
【发布时间】:2015-01-06 09:40:16
【问题描述】:

我经常遇到这个异常。

2015-Jan-06 14:24:59.167 (SEVERE) 尝试获取时发现死锁 lock [0] System.Exception Message = 尝试获取时发现死锁 锁定源 = Data.ResultAccumulator

我的应用程序是一个 VB.Net 应用程序,我正在使用 MySQL 连接 .Net 版本 6.8.3

在 DataAdapter.Update 方法中使用 DataTable 进行批量更新时,我遇到了这个异常。 整个更新过程都在 Transactions 中运行。

我发现了各种不同的线程,其中用户建议分析 Innodb 状态。所以我在得到这个异常后就获得了这个状态。但是不知道怎么分析。这是 innodb 的状态。

====================================== 2015-01-06 14:25:07 2ec INNODB 监控输出 ====================================== 从过去 29 秒计算的每秒平均值 ----------------- 背景线程 ----------------- srv_master_thread 循环:7208 srv_active,0 srv_shutdown,74547 srv_idle srv_master_thread 日志刷新并写入:81579 ---------- 信号量 ---------- OS WAIT ARRAY INFO:预留计数 3583 操作系统等待阵列信息:信号计数 4766 互斥体自旋等待 3514,回合 53287,操作系统等待 1608 RW 共享旋转 2281,回合 46994,操作系统等待 1262 RW-excl 旋转 1304,回合 36969,操作系统等待 674 每次等待的旋转轮数:15.16 mutex,20.60 RW-shared,28.35 RW-excl ------------ 交易 ------------ Trx id 计数器 1859662 清除已完成 trx 的 n:o = 1859662 的 trx,看到

谁能告诉我调试这个问题的方法,以便我找到解决方法。

【问题讨论】:

    标签: mysql database vb.net innodb deadlock


    【解决方案1】:

    您的问题中的状态不包含任何死锁信息,所以您没有在死锁之后立即接受它。
    可能是在您接受状态之前服务器已经重新启动
    状态必须包含一个类似于以下示例的部分:

    ------------------------
    LATEST DETECTED DEADLOCK
    ------------------------
    2015-01-06 11:47:02 da8
    *** (1) TRANSACTION:
    TRANSACTION 24103246, ACTIVE 16 sec starting index read
    mysql tables in use 1, locked 1
    LOCK WAIT 3 lock struct(s), heap size 376, 2 row lock(s)
    MySQL thread id 3, OS thread handle 0xde8, query id 102 localhost 127.0.0.1 test
     updating
    update test set test=1 where test=1
    *** (1) WAITING FOR THIS LOCK TO BE GRANTED:
    RECORD LOCKS space id 489 page no 3 n bits 80 index `PRIMARY` of table `test`.`t
    est` trx id 24103246 lock_mode X locks rec but not gap waiting
    Record lock, heap no 2 PHYSICAL RECORD: n_fields 3; compact format; info bits 0
     0: len 4; hex 80000001; asc     ;;
     1: len 6; hex 0000016fc940; asc    o @;;
     2: len 7; hex a80000026e0110; asc     n  ;;
    
    *** (2) TRANSACTION:
    TRANSACTION 24103245, ACTIVE 63 sec starting index read, thread declared inside
    InnoDB 5000
    mysql tables in use 1, locked 1
    3 lock struct(s), heap size 376, 2 row lock(s)
    MySQL thread id 4, OS thread handle 0xda8, query id 103 localhost 127.0.0.1 test
     updating
    update test set test=4 where test=4
    *** (2) HOLDS THE LOCK(S):
    RECORD LOCKS space id 489 page no 3 n bits 80 index `PRIMARY` of table `test`.`t
    est` trx id 24103245 lock_mode X locks rec but not gap
    Record lock, heap no 2 PHYSICAL RECORD: n_fields 3; compact format; info bits 0
     0: len 4; hex 80000001; asc     ;;
     1: len 6; hex 0000016fc940; asc    o @;;
     2: len 7; hex a80000026e0110; asc     n  ;;
    
    *** (2) WAITING FOR THIS LOCK TO BE GRANTED:
    RECORD LOCKS space id 489 page no 3 n bits 80 index `PRIMARY` of table `test`.`t
    est` trx id 24103245 lock_mode X locks rec but not gap waiting
    Record lock, heap no 5 PHYSICAL RECORD: n_fields 3; compact format; info bits 0
     0: len 4; hex 80000004; asc     ;;
     1: len 6; hex 0000016fc940; asc    o @;;
     2: len 7; hex a80000026e0137; asc     n 7;;
    
    *** WE ROLL BACK TRANSACTION (2)
    ------------
    TRANSACTIONS
    ------------
    

    【讨论】:

    • 我在死锁之后才使用它,因为我从我的日志文件中获得了这个 innodb 状态,仅在其中我捕获了这个死锁异常,然后立即运行“show engine innodb status”命令来查找状态.我是否需要在发生异常的同一事务中运行它,因为由于异常,正在进行的事务被回滚,然后我已经采取了这个状态。
    猜你喜欢
    • 2017-02-07
    • 1970-01-01
    • 1970-01-01
    • 2017-04-05
    • 1970-01-01
    • 1970-01-01
    • 2015-11-22
    • 2013-09-20
    • 2013-07-18
    相关资源
    最近更新 更多