学习内容:根据加锁的范围,MySQL里面的锁大致可以分成全局锁、表级锁和行锁三类。
1.全局锁就是对整个数据库实例加锁,典型使用场景是做全库逻辑备份。
全局锁的典型使用场景是,做全库逻辑备份
官方自带的逻辑备份工具是 mysqldump。当 mysqldump 使用参数–single-transaction 的时候,导数据之前就会启动一个事务。
对于全部是 InnoDB 引擎的库,建议使用–single-transaction 参数。
single-transaction 方法只适用于所有的表使用事务引擎的库。
2.表级锁包括表锁和MDL锁两种。表锁一般是在数据库引擎不支持行锁的时候才会被用到的。
表锁的语法是 lock tables … read/write。
3.行锁就是针对数据表中行记录的锁,但并不是所有的引擎(MyISAM)都支持行锁。
两阶段协议:在 InnoDB 事务中,行锁是在需要的时候才加上的,但并不是不需要了就立刻释放,而是要等到事务结束时才释放。
如果你的事务中需要锁多个行,要把最可能造成锁冲突、最可能影响并发度的锁尽量往后放。
死锁和死锁检测
死锁:当并发系统中不同线程出现循环资源依赖,涉及的线程都在等待别的线程释放资源时,就会导致这几个线程都进入无限等待的状态。
解决死锁的两种策略:
1.直接进入等待,直到超时。这个超时时间可以通过参数 innodb_lock_wait_timeout 来设置。
2.发起死锁检测,发现死锁后,主动回滚死锁链条中的某一个事务,让其他事务得以继续执行。将参数 innodb_deadlock_detect 设置为 on,表示开启这个逻辑。
正常情况下我们还是要采用第二种策略,即:主动死锁检测
怎么解决由这种热点行更新导致的性能问题呢?
一种头痛医头的方法,就是如果你能确保这个业务一定不会出现死锁,可以临时把死锁检测关掉。
另一个思路是控制并发度。
网友评论