mysql 死锁问题排查

show full PROCESSLIST  state看状态 time排序看时间 Info看执行具体的sql

获取了最新的死锁日志,即执行show engine innodb status
session 会话id query id 3044023120
执行sql线程  thread id 1223399
事务ID  TRANSACTION 1057869923

kill 线程id
一条SQL先更新a再更新b,另一条sql先更新b再更新a!!!  导致死锁比较多的情况
死锁超时的话,sql会回滚  可能另一条sql就可以获取锁了

这种不会发生死锁  没有异步情况下  a执行完才会执行b 才会进入下一次循环!!
while{
	tranction test{
		update a
		update b
  }
}


表级锁,锁定整张表
页级锁,锁定一页
行级锁,锁定一行
共享锁,也叫S锁,在MyISAM中也叫读锁
排他锁,也叫X锁,在MyISAM中也叫写锁
悲观锁,抽象性质,其实不真实存在
乐观锁,抽象性质,其实不真实存在
互斥锁,每一次只能被一个线程所持有
自旋锁,为了让线程进行等待,让线程不断执行一个空操作的循环
间隙锁:通过 Next-Key Lock 防止幻读。 
意向锁:通过 IS 和 IX 锁进行更细粒度(行级)的锁管理


Mybatis-Plus saveBatch()批量保存失效的解决
实体属性为null时,会影响生成的插入sql,进而影响批量保存逻辑
不同的属性字段为null,就会导致拆成多个insert 导致插入慢
底层doUpdate  sql.equals(currentSql) 不一样  null值导致
可能在字段属性加@TableField(insertStrategy = FieldStrategy.IGNORED)
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
MySQL死锁数据库并发操作中常见的问题,当两个或更多的事务在执行过程中相互等待对方释放资源时,就会形成死锁。这通常发生在两个事务分别持有对方需要的锁时,导致彼此都无法继续执行。要排查MySQL死锁,可以按照以下步骤进行: 1. **查看死锁信息**: - 使用`SHOW ENGINE INNODB STATUS`命令,它会显示当前InnoDB引擎中的锁定情况,包括可能的死锁信息。 2. **确定死锁事务ID**: - 在死锁日志(通常是`ib_logfile0`或`ib_logfile1`)中查找死锁消息,会有一个事务ID列表,这些事务正在等待锁定。 3. **分析事务日志**: - 使用`mysqladmin`的`force-recovery`选项读取事务日志,尝试回滚事务,看看是否能解除死锁。但是要小心,这可能会导致数据丢失。 4. **使用`SHOW PROCESSLIST`**: - 查看所有活动的连接(进程),检查哪些事务处于活跃状态,以及它们的锁模式和锁定的行。 5. **手动解锁**: - 对于已经识别出的死锁事务,可以通过`KILL`命令强制结束,但需要谨慎,因为这可能破坏数据一致性。 6. **锁定策略调整**: - 检查应用程序的锁定策略,确保不会无意识地创建死锁条件,比如避免循环依赖锁。 7. **定期检查锁定表**: - 查看`INFORMATION_SCHEMA`.`LOCKS`表,了解哪些资源被锁定,以及锁定的时间长度,以便判断是否存在长时间的死锁。 8. **设置死锁检测参数**: - MySQL有`innodb_lock_wait_timeout`参数,可以设置超时限制以避免长时间的等待,但如果频繁触发,可能需要优化锁的获取顺序或程序逻辑。 相关问题-- 1. 如何在MySQL查看死锁日志? 2. 死锁发生时,如何在不破坏数据的情况下结束事务? 3. 如何防止应用程序产生过多的死锁
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值