13.MySQL锁机制

锁的分类

  从对数据的类型 (读\写)分:

    1.读锁(共享锁):针对同一份数据,多个读操作可以同时进行而不会互相影响

    2.写锁(排它锁):当前写操作没有完成前,它会阻断其他写锁和读锁

  从对数据操作的粒度分:

    1.表锁

    2.行锁

表锁(偏读)

  1.偏向MyISAM存储引擎,开销小,加锁快;无死锁;锁的粒度大,发生锁冲突的概率最高,并发度最低

  2.MyISAM 在执行查询(SELECT)语句前,会自动给涉及的所有表加读锁,在执行更新操作(UPDATE/DELETE/INSERT等)前,

  会自动给涉及的表加写锁,这个过程并不需要用户参与,我们试验中使用 lock table 是为了模拟并发环境

  加读锁   

    1.会话一中A表加读锁(lock table tablename read),会话二不锁任何表

    2.会话一中 可以查询A表,也只能查询A表,对A表的写操作会报错,对其他的表的读写操作也报错

    3.会话二中,可以读A表,也可以对其他表进行读写,但只对A表的写操作会阻塞,必须等会话一释放 A表的读锁(unlock tables),会话二才能完成写操作

  加写锁 

    1.连接一,给一张表加 写锁,这个连接可以对这张表进行 读和写,但是不能访问其他表

    2.连接二 可以访问其他未加锁的表,但是对加了写锁的表 的读 和 写 会阻塞(即排他),等待连接一中锁的释放

简而言之,就是读锁会阻塞写,但是不会阻塞读,而写锁则会把 读和写 都阻塞(对于其他连接而言)

表锁分析    show status like ‘table%’

行锁(偏写)(行锁出现的前提是在事务中)

  1.偏向 Innodb 存储引擎,开销大,加锁慢;会出现死锁;锁的粒度最小,发生锁冲突的概率最低,并发度也最高

  2.Innodb 和 Myisam最大不同的有两点:一是只是事务(TRANSACTION);二是采用了行级锁

  

  3.由于行锁支持事务,我们复习一下关于事务的知识

    1.事务及其ACID属性

    2.并发事务 带来的问题

      1.更新丢失(Lost  Update)

      2.脏读(Dirty Reads)

      3.不可重复读(Non-Repeatable Reads)

      在事务A的执行过程中,事务B进行了开启,修改和提交,导致事务A在事务B执行前读取的数据和事务B执行后读取的数据不一致

      4.幻读(Phantom  Reads)

      和 不可重复读 类似,不过不可重复读针对的列的修改,而幻读针对的是列的增加

    3.事务隔离级别

  

  4.行锁定基本演示:事务中对数据的更新才会触发行锁,

    如:连接一开启了事务,在事务中,对表的某一行数据进行更新(此时就把这一行锁定了)(查询不会锁定),

    在该事务提交之前, 连接二发出了update语句,想对被锁的这一行数据进行更新,此时 连接二的语句就会发生阻塞,

    需要到等待连接一中 事提交,行锁释放,才能继续执行

    但是因为是行锁,所以连接二对其他行的数据更新是不会受影响的

  5.无索引行锁升级为表锁(索引失效)

    当出现行锁时,如果行锁锁定的这一行上面 有字段(如name)建立了索引,如果这个索引失效了(比如字符型不加‘’ where name = 1234),

    那么行锁 会自动升级为表锁,其他行数据的 更新 也会被锁定,其他连接无法对这个表进行更新

  6.间隙锁(宁可错杀,不可错放)

    当我们使用范围条件而不是相等相等条件检索数据时,它会锁定整个范围内所有的索引键值,即使这个键值并不存在

    如:有这样一段数据,id = 1,id = 3,id = 4...中间少了一个 id = 2,如果此时连接一 开启一个事务,更新数据当 1<id <4,

    此时Mysql本着宁可错杀,不可错放的原则,即使id=2 不存在也会被无情的锁定,

    连接二想要插入 一条id=2的数据是不行的,会阻塞,等待连接一事务提交,行锁释放

  7.如何锁定一行

    for update可以锁定某一行,也可以锁定整张表

    主要是看 select语句后面是否有where,where限定的范围 即锁的范围, select xxx... for update

    如果没有 where,则锁定整张表,锁定之后,其他连接 就无法对锁定的范围进行 更新操作

  8.行锁分析:show status like ‘innodb_row_lock%‘

为什么说行锁偏写,表锁偏读,即Myisam偏写,Innodb偏读

  Myisam 读的性能高

  Myisam 的读写锁调用 是写优先,这也是myisam不适合做写为主表的引擎。因为写锁后,其他线程不能做任何操作,大量的更新会使查询很难得到锁,从而造成永久阻塞

  Innodb行锁是单比查询比不过,但是innodb支持高并发,支持事务

  在写多读少的应用中还是Innodb插入性能更稳定,在并发情况下也能基本保证性能

可以根据系统的读写情况 来选择合适的 Mysql存储引擎

优化建议

  1.尽可能让所有数据检索都通过索引来完成,避免无索引行锁升级为表锁

  2.合理设计索引,尽量缩小锁的范围

  3.尽可能较少检索条件,避免间隙锁

  4.尽量控制事务大小,减少锁定资源量和时间长度

  5.尽可能低级别事务隔离

页锁(了解一下即可)

  1.开销和加锁时间介于表锁和行锁之间

  2.会出现死锁

  3.锁定粒度介于表锁和行锁之间,并发度一般

    

  

时间: 2024-10-20 12:04:52

13.MySQL锁机制的相关文章

mysql锁机制(转载)

锁是计算机协调多个进程或线程并发访问某一资源的机制 .在数据库中,除传统的 计算资源(如CPU.RAM.I/O等)的争用以外,数据也是一种供许多用户共享的资源.如何保证数据并发访问的一致性.有效性是所有数据库必须解决的一 个问题,锁冲突也是影响数据库并发访问性能的一个重要因素. 从这个角度来说,锁对数据库而言显得尤其重要,也更加复杂.本章我们着重讨论MySQL锁机制 的特点,常见的锁问题,以及解决MySQL锁问题的一些方法或建议. MySQL锁概述相对其他数据库而言,MySQL的锁机制比较简单,

对mysql锁机制的学习

1.对于mysql学习,经常翻看一些博客,论坛,好像或多或少有mysq锁机制的学习与总结,所以今天有必要 对mysql锁机制的一些个人的总结,以便以后深入的学习. 2.学习这件事,从来都是“深入浅出”的,今天留个痕迹,说不定以后“受益匪浅”. a.数据库锁是什么 数据库锁就是为了保证数据库数据的一致性在一个共享资源被并发访问时使得数据访问顺序化的机制. MySQL数据库的锁机制比较独特,支持不同的存储引擎使用不同的锁机制. b.mysql锁机制的3中类型 表级锁,行级锁,页级锁 c.各级锁的特点

Mysql锁机制和事务控制

如何加锁 锁定表的语法:    LOCK TABLES    tbl_name [AS alias] {READ [LOCAL] | [LOW_PRIORITY] WRITE}    [, tbl_name [AS alias] {READ [LOCAL] | [LOW_PRIORITY] WRITE}] ...解锁语法:    UNLOCK TABLES innodb的存储引擎提供行级锁,支持共享锁和排他锁两种锁定模式,以及四种不同的隔离级别. 死锁 InnoDB自动检测事务的死锁,并回滚一个

mysql锁机制详解

前言 大概几个月之前项目中用到事务,需要保证数据的强一致性,期间也用到了mysql的锁,但当时对mysql的锁机制只是管中窥豹,所以本文打算总结一下mysql的锁机制. 本文主要论述关于mysql锁机制,mysql版本为5.7,引擎为innodb,由于实际中关于innodb锁相关的知识及加锁方式很多,所以没有那么多精力罗列所有场景下的加锁过程并加以分析,仅根据现在了解的知识,结合官方文档,说说自己的理解,如果发现有不对的地方,欢迎指正. 概述 总的来说,InnoDB共有七种类型的锁: 共享/排它

mysql锁机制整理

Auth: jinDate: 20140506 主要参考整理资料MYSQL性能调优与架构设计-第七章 MYSQL锁定机制http://www.cnblogs.com/ggjucheng/archive/2012/11/14/2770445.html理解MySQL--架构与概念http://www.cnblogs.com/yequan/archive/2009/12/24/1631703.html 一.mysql锁类型及应用介绍1.锁类型和应用类型相對其他數據庫而言,MySQL的鎖機制比較簡單,其

MySQL锁机制浅析

MySQL使用了3种锁机制 行级锁,开销大,加锁慢,会出现死锁,发生锁冲突的概率最高,并发度也最高 表级锁,开销小,加锁快,不会出现死锁,发生锁冲突的概率最低,并发度最低 页级锁,开销和加锁时间界于表锁和行锁之间:会出现死锁:锁定粒度界于表锁和行锁之间,并发度一般 MySQL的存储引擎,这里指常用的,InnoDB,默认是行级锁,如果不指定主键的话,那么就是表级锁了,这点切记 MyISAM是表锁 innoDB 先来了解下MySQL事务 事务是由一组sql语句组成的逻辑处理单元,有4个属性ACID

Mysql 锁机制和事务

InnoDB 锁机制 InnoDB存储引擎支持行级锁 其大类可以细分为共享锁和排它锁两类 共享锁(S):允许拥有共享锁的事务读取该行数据.当一个事务拥有一行的共享锁时,另外的事务可以在同一行数据也获得共享锁,但另外的事务无法获得同一行数据上的排他锁 排它锁(X):允许拥有排它锁的事务修改或删除该行数据. 当一个事务拥有一行的排他锁时,另外的事务在此行数据上无法获得共享锁和排它锁,只能等待第一个事务的锁释放 除了共享锁和排他锁之外, InnoDB也支持意图锁.该锁类型是属于表级锁,表明事务在后期会

20.Mysql锁机制

20.锁问题锁是计算机协调多个进程或线程并发访问某一资源的机制. 20.1 Mysql锁概述锁类型分为表级锁.页面锁.行级锁.表级锁:一个线程对表进行DML时会锁住整张表,其它线程只能读该表,如果要写该表时将产生锁等待. 优点:开销少.加锁快.不会产生死锁.缺点:锁粒度大.容易产生锁等待.并发低.行级锁:一个线程对表进行DML时会锁住该表影响的行,其它线程可以读该表,也可以DML该表其它的行,如果要DML已被锁定的行时将产生锁等待. 缺点:开销大.加锁慢.会产生死锁.优点:锁粒度小.不容易产生锁

6.mysql 锁机制

概述 定义: 锁是计算机协调多个进程或者线程并发访问某一资源的机制 在数据库中,除传统的计算资源(如CPU,RAM,IO等)的争用以外,数据也是一种供许多用户共享的资源.如何保证数据并发 访问的一致性.有效性是所有数据库必须解决的一个问题,锁冲突也是影响数据库并发访问性能的一个重要因素.从这个角度 来说,锁对数据库而言显得尤其重要,也更加复杂. 实际场景案例:生活购物 打个比方,我们在淘宝上抢购一件商品,商品只有一件库存,这个时候如果有很多人想去买,那么如何解决是你买到还是其他人买到的问题? 这