MySQL中的锁,分为全局锁、表级锁、行锁

全局锁

全局锁的意思就是,对整个数据库实例加锁,它的命令是FTWRL

Flash tables with read lock

这个命令的语义是,使整个库处于一种只读的状态,使用这个命令后,以下语句会被阻塞:数据的更新、数据结构的定义、更新类事务的提交。
全局锁通常被用于全库逻辑备份,但是让整个库只读,会有两个问题:

  1. 主库上的备份,会使整个业务停摆。
  2. 从库上的备份,会造成备份期间,从库无法执行主库同步过来的bin log而造成主从延迟。

官方自带的逻辑是mysqldump,导数据之前,会开启一个事务,目的是拿到一致性视图,由于MVCC(数据多版本并发控制),备份的过程中,数据是可以正常更新的。但是由于只有InnoDB支持事务,所以只有InnoDB可以使用mysqldump来对数据库进行逻辑备份。这也是为什么现在都建议使用InnoDB的原因之一。

表级锁

MySQL里面的表级锁有两种,一种是表锁,一种是MDL元数据锁。(Meta data lock)
表锁的语法是:

lock tables ...read/write

整张表上锁,不仅限制其他线程的操作,同时也限制本线程的操作。
MDL是一种隐式锁。他的所用是保证读写操作的正确性,MDL是MySQL5.5版本之后引入的,当对一个表进行增删改查的时候,会加MDL读锁。对表结构进行修改的时候,会加MDL写锁。读写锁之间、写锁之间是互斥的。(所以写锁也叫排它锁,读锁也叫共享锁)。
锁只有在事务提交的时候,才会释放。所以长事务会一致占用锁。所以修改表结构的时候,要注意,不要阻塞线上正在执行的增删改查操作。

行锁

行锁是存储引擎层实现的,所以这也是为什么要用InnoDB引擎来代替MyISAM引擎的原因之一。
有两个事务都在更改同一条热点数据。这个时候,会出现阻塞现象。
在InnoDB引擎中,行锁是需要的时候加上的,但是释放锁的时候,却是事务结束的时候才释放。所以如果一个事务要锁多个行,要把最可能造成锁冲突的语句放到后面,这样可以减少阻塞的时间。

死锁和死锁检测

并发系统中,不同线程出现循环依赖资源,涉及到的线程都在等待其他线程释放资源,导致无限等待的状态,称为死锁。
有两种思路可以解决死锁问题:

  1. 设置超时等待,innodb_lock_wait_timeout,默认是50s,显然这个时间太长了,但是这个值的大小很难确定,会误伤正常的锁等待。
  2. 发起死锁检测,发生死锁后,主动回滚死锁链条中的某一事务,让其他事务可以正常执行。参数是innodb_deadlock_detect

但是死锁检测是需要额外负担的,我们可以做并发控制,减少共享资源的争抢。

最新文章

  1. PHP基础知识第一趴
  2. c# ContinueWith 用法
  3. 西部数据出现“WD SES Device USB Device”怎么办,而且说明书全是英文。
  4. Python打包-py2exe使用
  5. 破解 keyme2程序(固定明码比较)
  6. 开源Math.NET基础数学类库使用(11)C#计算相关系数
  7. Android开发之漫漫长途 Ⅷ——Android Binder(也许是最容易理解的)
  8. jquery四种监听事件的区别
  9. ROS_Kinetic_17 使用V-Rep3.3.1(vrep_ros_bridge)
  10. Boyer-Moore算法
  11. 【子集或者DFS】部分和问题
  12. Nestjs 设置静态文件,public
  13. linux screen 命令 :离线运行程序
  14. Dubbo的学习
  15. Mybatis之动态构建SQL语句(转)
  16. 带你了解CSRF和XSS(二)
  17. ARM、X86/Atom、MIPS、PowerPC
  18. c++学习笔记—动态内存与智能指针浅析
  19. python 正则表达式匹配ip
  20. C/C++ -- Gui编程 -- Qt库的使用 -- 构造函数中添加组件

热门文章

  1. dp复习 背包[礼物]
  2. aapt dump报错dump failed because no AndroidManifest.xml found解决方式
  3. C# .Net Framework
  4. django创建表单以及表单数据类型和属性
  5. 实验吧之【拐弯抹角】(url伪静态)
  6. msf之hash攻击
  7. PHP array_udiff_assoc
  8. 《FFT家族—从不会到崩溃(坑)》读blog笔记
  9. vue3.0 + ueditor
  10. Vue系列---理解Vue.nextTick使用及源码分析(五)