行锁
行锁针对数据表中行记录的锁,需要存储引擎支持,MyISAM不支持,InooDB支持, 在InnoDB事务中,行锁在需要时才加上,但并不是不需要了就立刻释放,而是要等到事务结束时才释放,所以如果你的事务中需要锁多个行,要把最可能造成锁冲突、最可能影响并发度的锁尽量往后放,以减少对性能的损耗。
死锁与死锁检测
MySQL中处理死锁有两种不同的策略:
1.直接进入等待,直到超时。这个超时时间可以通过参数innodb_lock_wait_timeout
来设置。这个,的缺点在于,超时时间默认为50s,这对于大多数业务是不可容忍的,如果将这个时间修改的更小一些(如1s)则会发生本应等待锁处理的线程直接超时失败的问题,这个值很难去进行精准的控制。
2.发起死锁检测,发现死锁后,主动回滚死锁链条中的某一个事务,让其他事务得以继续执行。将参数innodb_deadlock_detect
设置为on,表示开启这个逻辑。这种策略相对较好,但是检测死锁需要耗费CPU资源,在并发数量大的情况也不是很好,可以在中间件或MySQL源码进行改造,对于相同行的更新,在进入引擎之前排队,避免在InnoDB内部有大量的死锁检测工作,也可以人为的将数据分散存储,类似于分表。
参考文献
MySQL实战45讲