mysql数据库死锁

      当我们频繁的对数据库进行插入或更新的时候,有可能会直接报sql错误1205:lock wait timeout exceeded。数据库的死锁。

   一般INNODB数据库会自动添加事务,当进行插入或者更新的时候,如果上次commit尚未执行完,而又有一次新的commit提交的时候,系统就会报SQL错误1205:lock wait timeout exceeded。这就是mysql死锁。

    作为一个新手,碰到这样苦逼的事情自然是手足无措。于是赶紧上网看看解决方案,不负所望,网上还真找到相应的结局方案,而且给了三种:

   1 应急方案:简单暴力 show processlist;然后看是哪个进程引起的死锁,直接kill掉。

   2 根治方案: select * from innodb_trx 查看是那些事务占据了资源(这个方案说到这里就没有然后了,查看完了呢?卧槽,也是不负责任)。

   3 设置等待超时:innodb_lock_wait_timeout=50,autocommit=on. 设置等待超时这个方案看起来不错,但是仔细一样,你设置多少合适呢?万一每次更新上万条数据呢,慢的很怎么办?突然感觉可行性不高。第二种呢,根本没有讲完就算了。只能选择简单暴力第一种。

    后来我咨询了一下数据库方面的大神,他给我推荐了一个方案:先禁用索引,再关闭,再关闭自动提交,再关闭数据库日志。然后他给我操作了一遍(当然我没学会),不过还真的好使,建议会用的可以试试。

### 解决 MySQL 数据库死锁问题 #### 死锁现象描述 在并发系统中,特别是数据库操作时,当两个或更多事务相互持有并等待对方释放所需资源的情况称为死锁。这种情况下,每个事务都无限期地等待另一个事务完成,从而形成僵局。对于MySQL而言,典型的错误提示为 “Deadlock found when trying to get lock...”[^2]。 #### 查看当前活动的事务及其锁定状态 为了更好地理解哪些查询参与到了死锁之中,可以利用 `information_schema` 下面的一些视图来进行分析: ```sql SELECT * FROM information_schema.innodb_trx\G; ``` 这条命令能够展示所有正在运行中的InnoDB事务详情,帮助识别可能涉及死锁的操作[^3]。 进一步地,通过联合查询 `INNODB_LOCKS` 和 `INNODB_LOCK_WAITS` 表可以获得更详细的关于具体哪个事务阻塞了其他事务的信息: ```sql SELECT r.trx_id waiting_trx_id, r.trx_mysql_thread_id waiting_thread, r.trx_query waiting_query, b.trx_id blocking_trx_id, b.trx_mysql_thread_id blocking_thread, b.trx_query blocking_query FROM information_schema.innodb_lock_waits w INNER JOIN information_schema.innodb_trx b ON b.trx_id = w.blocking_trx_id INNER JOIN information_schema.innodb_trx r ON r.trx_id = w.requesting_trx_id; ``` 上述SQL语句有助于追踪到具体的死锁链路以及相关联的SQL执行情况[^4]。 #### 预防措施与解决方案 针对由单个事务内多次跨表访问引发的潜在死锁风险,建议优化应用程序逻辑设计,尽可能减少复杂度高的嵌套查询次数;另外还可以考虑调整索引结构以提高数据检索效率,进而缩短加锁时间窗口[^1]。 如果业务允许的话,适当放宽事务隔离级别也是一种有效的策略,比如从可重复读(Repeatable Read)降级至读已提交(Read Committed),这可以在一定程度上缓解因高并发带来的争用压力。 最后值得注意的是,在某些特殊场景下即使采取预防手段也无法完全杜绝死锁的发生,此时应确保应用层具备良好的异常处理机制,能够在检测到死锁后自动重试失败交易直至成功为止。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值