行锁
InnoDB 的行锁
两阶段锁
在 InnoDB 事务中,行锁是在需要的时候才加上的,但并不是不需要了就立刻释放,而是要等到事务结束时才释放。这个就是两阶段锁协议。
如果你的事务中需要锁多个行,要把最可能造成锁冲突、最可能影响并发度的锁尽量往后放。
这样可以提高事务的并发程度
死锁和死锁检测
当并发系统中不同线程出现循环资源依赖,涉及的线程都在等待别的线程释放资源时,就
会导致这几个线程都进入无限等待的状态,称为死锁。
事务之间相互等待,这时就可能会发生死锁
死锁的两种策略
一:innodb_lock_wait_timeout 设置事务的等待时间 默认是50
二:innodb_deadlock_detect on 表示主动回滚死锁链中的某一条事务
正常情况下还是要采用第二种
如果每个新进来的线程都需要判断是不是由于自己的加入导致了死锁,这是一个时间复杂度为O(n)的操作
热点行更新导致的性能问题
一:头痛医头的方法,就是如果你能确保这个业务一定不会出现死锁,可以临时把死锁检
测关掉,这个操作具有一定的风险
二:控制并发度
客户端控制并发度:如果客户端很多,这种办法也是不可取的。应该在数据库进行并发度的控制
修改源码:在进入引擎之前排队。
三:从设计上优化这个问题
小结
这里的原则 :如果你的事务中需要锁多个行,要把最可能造成锁冲突、
最可能影响并发度的锁的申请时机尽量往后放