一、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. dubbo/dubbox 增加原生thrift及avro支持

    (facebook) thrift / (hadoop) avro / (google) probuf(grpc)是近几年来比较抢眼的高效序列化/rpc框架,dubbo框架虽然有thrift的支持,但 ...

  2. [LeetCode] Design Snake Game 设计贪吃蛇游戏

    Design a Snake game that is played on a device with screen size = width x height. Play the game onli ...

  3. Android开发之扫描二维码开发

    原贴地址:http://www.cnblogs.com/Fndroid/p/5540688.html 二维码其实有很多种,但是我们常见的微信使用的是一种叫做QRCode的二维码,像下面这样的,可以放心 ...

  4. C++知识回顾(一)

    感觉世界都是约定好的,每门语言的第一个程序总是Hello World!但是也有一些书似乎是在追求个性,会用一些其他的,但是是Not Hello World!本人需要再学习一下C++,所以从最基础的开始 ...

  5. [转]SQL 常用函数及示例

    原文地址:http://www.cnblogs.com/canyangfeixue/archive/2013/07/21/3203588.html --SQL 基础-->常用函数 --===== ...

  6. 读取TDrawGrid之获取博易数据

    朋友叫我帮忙写个从博易读取数据的工具,可无奈数据所在控件并不是Windows标准控件,也就是说没办法通过发送系统消息来获取 相关数据,于是乎试了一下从内存直接读取,可最后并不能达到预期目的,原因是笔者 ...

  7. iOS推送证书转pem文件

    iOS推送证书转 .pem文件. 推送证书转pem文件openssl x509 -in apns_miaobozhibo.cer -inform der -out apns_miaobozhibo.p ...

  8. [bzoj2732][HNOI2012]射箭

    Description 沫沫最近在玩一个二维的射箭游戏,如下图所示,这个游戏中的$x$轴在地面,第一象限中有一些竖直线段作为靶子,任意两个靶子都没有公共部分,也不会接触坐标轴.沫沫控制一个位于$(0, ...

  9. C#重写一个控件Label

    1. 首先你把一个label控件拖到窗体上.2. 创建一个准备继承的类,比如叫LabelEx,派生于Label类 public class LabelEx : Label { //鼠标左键双击消息 p ...

  10. html5+css+div随时笔记

    首先给头部文件引用格式 <link href="<%=basePath%>temp/public/css/style.css" rel="stylesh ...