一、MySQL中不同的存储引擎支持不同的锁机制

  (A) MyISAM 和 MEMORY 支持表级锁

  (B) BDB 支持页面锁,也支持表级锁

  (C) InnoDB 支持行级锁,也支持表级锁,默认是行级锁。

  这三种锁的特性如下:

  表级锁:开销小,加锁快,不会死锁,粒度大,冲突概率高,并发度低

  行级锁:开销大,加锁慢,会死锁,粒度小,冲突概率低,并发度高

  页面锁:开销中,加速中,会死锁,粒度中,冲突概率中,并发度中

二、MyISAM表锁

  (A) 检查 table_locks_waited 和 table_locks_immediate 状态变量来分析系统上表锁的争夺情况。

  (B) 表锁有分为:共享读锁和独占写锁

  (C) 在查询语句前,会自动给涉及的所有表加读锁,在更新操作前,会自动给涉及的所有表加写锁。

  (D) 总是一次性获得所需的所有锁,这样就不会出现死锁。同时SQL中出现的表别名也需要锁定。

  (E) 并发插入:一定条件下,MyISAM表支持查询和插入,系统变量concurrent_insert 是否支持并发插入

    0:不允许并发插入

    1:表中没有空洞,运行读表的同时,另一个进程表尾插入

    2:运行表尾插入。

三、MyISAM的锁调度

  (A) 写优先策略:可通过参数 low-priority-updates 修改;通过命令修改;修改属性等方法。

  (B) 注意:一条长时间运行的查询语句可能会使写进程”饿死“。

四、InnoDB锁问题

  一是支持事务、二是采用行级锁

  事务是一组SQL语句组成的逻辑处理单元,具有ACID属性,原子性、一致性、隔离性和持久性。

  并发事务访问带来的问题:更新丢失、脏读、不可重复读、幻读。

  (A) 可以通过检测InnoDB_row_lock状态变量来分析系统上行锁的争夺情况

  (B) InnoDB实现了两种类型的行锁:共享锁和排他锁。内部使用了两种表级别的意向锁。

  (C) 行锁是通过给索引上的索引项加锁来实现的。意味着:只有通过索引条件检索数据,InnoDB才使用行级锁,否则,InnoDB将使用表锁。

  (D) 注意InnoDB的锁机制是间隙锁,这将导致锁定比实际更多的记录行,尽量采用相等条件而不是范围条件来避免此类问题。同时:如果使用相等条件给一个不存在的记录加锁,也会导致间隙锁。

五、回复和复制的需要,对InnoDB锁机制的影响

  (A) MySQL通过BINLOG记录执行成功的INSERT、UPDATE、DELETE等更新数据的SQL语句。并以此实现MySQL数据库的恢复和主从复制。

  MySQL的恢复是SQL语句级别的,也就是重新执行BINLOG中的SQL语句。

  Binlog是按照事务提交的先后顺序记录的,恢复也是按照这个顺序。

  根据上面的两个特点:我们知道一个事务提交前,其他事务不能插入满足其锁定条件的任何记录,也就是不允许出现幻读。

  像 insert...select... 和 create table... select... 语句,虽然源表是查询,还是会对源码加锁,这是为了保证恢复和复制的一致性。不建议使用此种SQL语句。

  (B) 不同隔离级别下的一致性读及锁的差异

  不同隔离级别下,InnoDB实现一致性读和隔离级别的手段是不同的。

  

  (C) 默认应该使用行锁,某些情况考虑使用表锁

    事务需要更新大部分了或者全部数据,表又比较大。

    事务设计多个表,比较复杂,可能引起死锁。

    注意:表锁是由MySQL Server负责的,需要正确的设置。需要先将autocommit设为0,才给表加锁,事务结束前不要用unlock tables 释放表锁,其会隐式地提交事务;commit或rollback 并不能释放用lock tables 加的表级锁。

六、关于死锁

  InnoDB一般都能自动检测到死锁,并释放某个事务并回退。但在设计外部锁和表级锁时,不能完全可能。需要设置锁等待超时参数 innodb_lock_wait_timeout 来解决。此参数可解决大量事务挂起的问题。

  (A) 不同的程序尽量以相同的顺序来访问多个表。

  (B) 批量方式处理数据时,事先对数据排序,每个线程固定顺序来处理记录,降低死锁出现的可能。

  (C) 提前申请排他锁,而不是先申请共享锁,需要时再申请排他锁。

  (D) 在程序设计中捕获和处理死锁是一个好的编程习惯。

  (E) 使用 show innodb status 来查看事务的状态。

七、小结

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. kubernetes单机板

    参考地址: *** http://blog.csdn.net/carter115/article/details/51121223 ** http://www.cnblogs.com/dongdong ...

  2. 【C#】菜单功能,将剪贴板JSON内容或者xml内容直接粘贴为类

    VS 2015菜单功能,将剪贴板JSON内容或者xml内容直接粘贴为类

  3. 用vue.js学习es6(一):基本工具及配置

    一.工具: sublime,node.js,npm 1.安装sublime 的es6插件: (1).在sublime中按Ctrl+`调出console (2).粘贴以下代码到底部命令行并回车(subl ...

  4. 安卓 Handler

    1. 看视频有关Handler操作,没有用过,里面的老师也没有讲(新手太难了) 查了一下资料. 一.Handler的定义: 主要接受子线程发送的数据, 并用此数据配合主线程更新UI. 解释:当应用程序 ...

  5. java第二周周学习总结

    java运算符和循环 java运算符 一.for 语句 for 语句的基本结构如下所示:for(初始化表达式;判断表达式;递增(递减)表达式){    执行语句;   //一段代码} 初始化表达式:初 ...

  6. COGS2531. [HZOI 2016]函数的美 打表+欧拉函数

    题目:http://cogs.pw/cogs/problem/problem.php?pid=2533 这道题考察打表观察规律. 发现对f的定义实际是递归式的 f(n,k) = f(0,f(n-1,k ...

  7. SUSE系统查看各种信息

    系统版本 # 显示内核版本 uname -a # 可看gcc版本 cat /proc/version # 显示linux基准库 lsb_release -a # 显示Suse版本准确版本 cat /e ...

  8. substr()函数

    substr 定义于头文件 <string> string substr (size_t pos = 0, size_t len = npos) const;复制子字符串,要求从指定位置开 ...

  9. ios相同版本升级

    公司新发布ios,因为各种错误以及审核不通过造成app未能上传,而app在提交的时候不能上传相同的版本号,造成app还没有正式的上传上传已经将版本号升级到1.0.6 解决方法: 在Xcode上,查看项 ...

  10. iframe的sandbox使用

    sandbox:限制iframe的权限,解决安全性问题. 定义 如果被规定为空字符串(sandbox=""),sandbox 属性将会启用一系列对行内框架中内容的额外限制.sand ...