MySQL 行锁

InnoDB 和 MyISAM 对比

  • Innodb 支持崩溃恢复
  • InnoDB 支持事务
  • InnoDB 支持行锁
  • B+Tree 叶子节点存储内容不同
  • MyISAM 记录表行总数,InnoDB 没有

两阶段锁

InnoDB 读操作会使用 MVCC,而写操作会使用写锁。

InnoDB 两阶段锁协议:行锁是在需要的时候加上的,并且要等到事务提交后才释放。

减少锁冲突

根据二阶段锁协议,如果事务中需要锁多行,要把最可能造成锁冲突、最可能影响并发度的锁往后放。(减少锁的持有时间)

死锁和死锁检测

处理死锁的策略

  • 等待超时 innodb_lock_wait_timeout,默认值50秒
  • 死锁检测 innodb_deadlock_detect=on 并回滚事务

死锁检测在高并发更新同一数据行会使用大量CPU,现象是 CPU 使用率很高,但每秒执行的事务却很少

  • 如果业务一定不会出现死锁,可以关掉死锁检测(不推荐)
  • 使用分布式 Semaphore 控制更新同一行并发度
  • 将一行拆除逻辑的多行
posted @ 2024-10-15 20:22  廖子博  阅读(7)  评论(0编辑  收藏  举报