MySQL的行锁是在引擎层由各个引擎自己实现的。但并不是所有的引擎都支持行锁,不支持行锁意味着并发控制只能使用表锁,这种引擎下的表,同一张表上任一时刻只能有一个更新在执行;会影响业务并发度;
两段锁
在InnoDB事务中,行锁是在需要的时候才加上的,但并不是不需要了就立刻释而是要等到事务结束时才释放。这个就是两阶段锁协议。
如果事务中需要锁多个行,要把最可能造成锁冲突,最有可能影响并发度的锁尽量后放,这样可以减少事务之间的锁等待,提升并发度;
死锁
不同线程出现资源的喜欢依赖,导致线程都进入无限等待的状态:死锁;
死锁解决办法
1.设置超时时间
2、发起死锁检测
设置超时时间时间过长和时间太短都不合适,所以选用发起死锁检测方法;
主动死锁检测在发生死锁的时候,是能够快速发现并进行处理的,但是它也是有额外负担的。因为每个新来的被堵住的线程都要判断是否由于自己的加入导致了死锁,这是个时间复杂度为O(n)的操作,即便检测没有死锁也会消耗大量CPU资源,此时CPU资源消耗很高,但执行不了几个事务;
解决死锁下的热点行更新的性能问题
1、确保业务不会出现死锁的情况下,关闭死锁检测;
2、控制并发度:在数据库服务端进行控制;
3、将一行改成逻辑上的多行来减少锁冲突;(要做比较详细的业务逻辑)