mysql实战(七)行锁、死锁
2020-12-14 本文已影响0人
WAHAHA402
MySQL的行锁是在引擎层实现的,MySQL原生引擎MyISAM不具备行锁,这也是被InnoDB替换它的原因。
两阶段锁协议:
InnoDB事务中,行锁是需要时才被加上的,该行锁在事务结束时才会被释放。
根据两阶段锁协议,可以联想到:如果一个事务需要锁多个行,要把最可能造成锁冲突、影响并发度的锁往后放(即:把可能导致行锁冲突的sql语句update语句等
,放在一个事务的最后执行)。
死锁和死锁检测
并发系统中不同线程出现循环资源依赖,互相等待对方释放资源却不得,而陷入无限等待的状态,称为死锁。
死锁解决策略
1、进入等待,直到超时。超时时间可以通过参数innodb_lock_wait_timeout
来设置。
缺点:设置太长,会导致很久才退出,服务停摆;设置太短,容易将执行时间较长的正常事务“误伤”。
2、主动检测死锁
更加常用。参数innodb_deadlock_detect
设置,默认为on。
缺点:很多线程同时更新热点行时,每个线程需要遍历其他线程占有的资源,时间复杂度为O(n平方)。
解决方法: 1)确保不会出现死锁是,关闭该参数为off 2)控制并发度(例如通过业务设计优化等方式)。