07 | 行锁功过:怎么减少行锁对性能的影响?

Page content

07 | 行锁功过:怎么减少行锁对性能的影响?

20210203091044

行锁由引擎实现,InnoDB支持行锁,MyISAM不支持

两阶段锁的概念是什么?

mysql中,行锁在需要的时候才会加上,但是要等事务提交以后才会释放

了解两阶段锁对使用事务有什么帮助?

事务中要锁多个行,要尽量把最可能造成冲突、最可能影响并发度的语句往后放

死锁的概念是什么?

当并发系统中不同线程出现循环资源依赖,涉及的线程都在等待别的线程释放资源时,就会导致这几个线程都进入无限等待的状态,称为死锁

死锁的处理策略有哪两种?

  • 一种策略是,直接进入等待,直到超时。这个超时时间可以通过参数 innodb_lock_wait_timeout 来设置。
  • 另一种策略是,发起死锁检测,发现死锁后,主动回滚死锁链条中的某一个事务,让其他事务得以继续执行。将参数 innodb_deadlock_detect 设置为 on,表示开启这个逻辑。

等待超时处理死锁的机制什么?有什么局限?

机制就是等待超时自动退出。但是超时时间设置过长会导致其它事务等待时间过长,超时时间设置太短又容易造成误伤,多会有损业务

死锁检测处理死锁的机制是什么? 有什么局限?

机制:每当一个事务被锁的时候,就要看看它所依赖的线程有没有被别人锁住,如此循环,最后判断是否出现了循环等待,也就是死锁。

局限:判断死锁的过程是一个时间复杂度为 O(n) 的操作,假如有 1000 个并发线程要更新同一行,那死锁检测是 100万量级,会占用大量CPU资源

有哪些思路可以解决热点更新导致的并发问题?

  • 临时关闭死锁检测
  • 控制并发度
  • 将一行改成逻辑上的多行来减少锁冲突