根据加锁的范围,MySQL的锁可以分为全局锁,表级锁和行锁。

1. 全局锁

  一般用于全局逻辑备份操作;

1.1 FTWRL

  MySQL提供了一个加全局读锁的方法。命令是:Flush tables with read lock(FTWRL),执行该命令以下语句会被阻塞:数据更新语句,数据定义语句和更新事务的提交语句。

  优点:

    1:适用于所有的引擎;

    2:客户端执行命令后若发生异常断开,则自动释放锁;

1.2 mysqldump

  MySQL自带的逻辑备份工具,当mysqldump使用参数 -single-transaction的时候,导数据前其启动一个事务来确保拿到一致性视图,因为MVCC的支持,这个过程中的数据也是可以正常更新的。

  缺点:引擎必须支持这个隔离级别,InnoDB支持该级别;

1.3  readonly

  通过设置参数 set global readonly = true,让全库进入只读状态

  缺点:

    1:在某些系统中,可能会通过该参数的值判断一个数据库是主库还是从库,修改该参数的方式影响较大,不建议使用;

    2:客户端在 set global readonly = true 之后若发生异常,该锁不会释放,整个库将一直处于只读状态,风险较大;

2. 表级锁

  表级锁有两种:一种是表锁,一种是元数据锁(meta data lock,MDL)。

2.1 表锁

  加锁语法:lock tables [table1] read,[table2] write;,该语句执行后,:

  当前线程可以读 table1,不能写 table1,其他线程可以读 table1,不能写 table1;

  当前线程可以读写 table2,其他线程不可以读写 table2;

  当前线程不可以访问其他表;

  解锁语法:unlock tables; ,该操作会释放所有表锁;

2.2  MDL

2.2.1 作用

  MDL不需要显示使用,访问一个表时自动加MDL锁。它的作用是:在读写期间,保证表结构的一致性;

2.2.2 读锁和写锁

  读锁之间不互斥,多个线程可以同时对一个表进行增删改查;

  读锁和写锁,写锁和写锁之间互斥,保证修改表结构操作的安全性;

  假设事务A查询记录,事务B修改表结构,事务C查询记录;

  当事务B获取到表的MDL写锁后,在事务B提交之前,事务B 之后的所有事务都需要进行等待;

  MDL锁会直到事务提交才释放,做表结构变更的时候一定不能阻塞线程的增删改查操作;

2.2.3 等待机制

  理想的机制是修改表结构时设置等待时间,在等待时间内获取到MDL锁则进行操作,否则放弃操作;

  MariaDB 支持该功能:

  alter table table_name  nowait add ...;

  alter table table_name wait  n add ...;

3. 行锁

  行锁由引擎层实现,并不是所有的引擎都支持行锁,InnoDB支持行锁。

  在InnoDB的事务中,行锁在需要时进行加锁,事务结束后释放锁。这就是两阶段锁协议。

  如果事务需要多个行锁,则尽可能将可能导致锁冲突的锁往后放;减少冲突锁的等待时间。

3.2 死锁和死锁检测

  假设有两个事务同时进行,事务A要先修改记录1,再修改记录2,事务B要先修改记录2,再修改记录1;

  当两个事务各自完成第一个操作后,都开始等待对方释放锁,这就形成了一个死锁;

  解决死锁的策略:

  1. 直接进入等待,直到超时。超时时间可通过 innodb_innodb_lock_wait_timeout 参数来设置,默认值为50;

   超时时间设置过长业务一般无法接受,时间过短又容易出现误伤,一般采用第二种方案,即死锁检测,

  2. 发起死锁检测,发现死锁后,主动回滚死锁链条中的某个事务,让其他事务继续执行,死锁检测可通过 innodb_deadlock_detect 参数设置为 on 开启该功能,默认值为 on;

      死锁检测需要消耗CPU资源,如果某个时刻进行大量事务的死锁检测,这需要耗费大量的CPU资源,但是事务执行效率却很低;所以尽量控制这个并发数量;

  

MySQL:锁的更多相关文章

  1. mysql锁

    锁是计算机协调多个进程或线程并发访问某一资源的机制.在数据库中,除传统的计算资源(如CPU.RAM.I/O等)的争用以外,数据也是一种供许多用户共享的资源.如何保证数据并发访问的一致性.有效性是所有数 ...

  2. Mysql锁初步

    存储引擎 要了解mysql的锁,就要先从存储引擎说起. 常用存储引擎列表如下图所示: 最常使用的两种存储引擎: Myisam是Mysql的默认存储引擎.当create创建新表时,未指定新表的存储引擎时 ...

  3. mysql锁表机制及相关优化

    (该文章为方便自己查阅,也希望对大家有所帮助,转载于互联网) 1. 锁机制 当前MySQL支持 ISAM, MyISAM, MEMORY (HEAP) 类型表的表级锁,BDB 表支持页级锁,InnoD ...

  4. MySQL锁系列3 MDL锁

    http://www.cnblogs.com/xpchild/p/3790139.html   MySQL为了保护数据字典元数据,使用了metadata lock,即MDL锁,保证在并发的情况下,结构 ...

  5. 01 MySQL锁概述

    锁是计算机协调多个进程或线程并发访问某一资源的机制.在数据库中,除传统的计算资源(如CPU.RAM.I/O 等)的争用以外,数据也是一种供许多用户共享的资源.如何保证数据并发访问的一致性.有效性是所有 ...

  6. Mysql锁机制介绍

    Mysql锁机制介绍 一.概况MySQL的锁机制比较简单,其最显著的特点是不同的存储引擎支持不同的锁机制.比如,MyISAM和MEMORY存储引擎采用的是表级锁(table-level locking ...

  7. MySQL锁等待分析【2】

    MySQL锁等待分析[1]中对锁等待的分析是一步一步来的.虽然最后是分析出来了,可是用时是比较长的:理清各个表之间的关系后,得到如下SQL语句,方便以后使用 select block_trx.trx_ ...

  8. MySQL锁与MVCC

    --MySQL锁与MVCC --------------------2014/06/29 myisam表锁比较简单,这里主要讨论一下innodb的锁相关问题. innodb相比oracle锁机制简单许 ...

  9. MySQL锁总结

    本文同时发表在https://github.com/zhangyachen/zhangyachen.github.io/issues/78 MySQL 锁基础 参考了何登成老师文章的结构MySQL 加 ...

  10. Mysql锁机制--并发事务带来的更新丢失问题

    Mysql 系列文章主页 =============== 刚开始学习 Mysql 锁的时候,觉得 Mysql 使用的是行锁,再加上其默认的可重复读的隔离级别,那就应该能够自动解决并发事务更新的问题.可 ...

随机推荐

  1. toString() 数组转字符串

    var monthNames = ['Jan', 'Feb', 'Mar', 'Apr']; var myVar = monthNames.toString(); // assigns "J ...

  2. 如何将 jar 包导入Maven 本地仓库

    案例:oracle jar包由于在maven 远程仓库中找不到,需要先将oracle jar 文件下载到本地,然后导入maven本地仓库,就可以通过 pom 进行依赖 例如:下载后的 jar 地址 D ...

  3. 微服务SpringCloud无法进行服务消费

    最近用SpringCloud做微服务,一直无法成功进行服务消费. 我使用的服务消费者是Feign,声明式调用服务提供者. 排查过程 1.检查服务提供者: (1)对提供的方法进行测试,确保提供的服务没有 ...

  4. Ueditor 前后端分离实现文件上传到独立服务器

    关于Ueditor 前后端分离实现文件上传到独立服务器,在网上搜索确实遇到大坑,不过还好遇到了 虚若影 最终实现了,在此感谢!虚若影的原文博客网址:http://www.cnblogs.com/hpn ...

  5. js函数内未声明变量

    <script> function test(){ testd = "Hello"; } test(); alert(testd); </script> 当 ...

  6. Python开发——函数【装饰器、高阶函数、函数嵌套、闭包】

    装饰器 装饰器本质就是函数,为其他函数添加附加功能. 原则: 不修改被修饰函数的源代码 不修改被修饰函数的调用方法 装饰器知识储备:装饰器 = 高阶函数 + 函数嵌套 + 闭包 案例:求函数运行时间! ...

  7. journalctl 清理journal日志

    在CentOS 7开始使用的systemd使用了journal日志,这个日志的管理方式和以往使用syslog的方式不同,可以通过管理工具维护. 使用df -h检查磁盘文件,可以看到/run目录下有日志 ...

  8. spring boot项目升级到2.0.1,提示java.lang.ClassNotFoundException: org.apache.log4j.Logger错误

    首先肯定是版本出现了一点兼容问题 所以我就进入项目,查看依赖树,cd到项目目录下,mvn dependency:tree 我看到我的项目原先是1.5.9和现在2.0.1的区别在于org.slf4j的依 ...

  9. spring boot + spring batch 读数据库文件写入文本文件&读文本文件写入数据库

    好久没有写博客,换了一家新公司,原来的公司用的是spring,现在这家公司用的是spring boot.然后,项目组布置了一个任务,关于两个数据库之间的表同步,我首先想到的就是spring batch ...

  10. [字符串]TrBBnsformBBtion

    TrBBnsformBBtion Let us consider the following operations on a string consisting of A and B: Select ...