zoukankan      html  css  js  c++  java
  • mysql锁机制(Innodb引擎)

     

    InnoDB实现了两种类型的行锁。

    共享锁(S:允许一个事务去读一行,阻止其他事务获得相同的数据集的排他锁。

    排他锁(X:允许获得排他锁的事务更新数据,但是组织其他事务获得相同数据集的共享锁和排他锁。

    简单来说

    共享锁就是我读的时候,你可以读,但是不能写。

    排他锁就是我写的时候,你即不能读也不能写。

    除此之外InnoDB还有两个表锁:

    意向共享锁(IS):表示事务准备给数据行加入共享锁,也就是说一个数据行加共享锁前必须先取得该表的IS

    意向排他锁(IX):类似上面,表示事务准备给数据行加入排他锁,说明事务在一个数据行加排他锁前必须先取得该表的IX锁。

    注意:意向锁是InnoDB自动加的,不需要用户干预。

     

    对于insertupdatedelete,操作

    InnoDB会自动给涉及的数据加排他锁;而对于一般的Select语句,InnoDB不会加任何锁(如果没有锁 也就是 select …… from where…… (没有额外加锁后缀)使用MVCC(multiple-version-concurrency-control)是行级锁的变种,它在普通读情况下避免了加锁操作,因此开销更低)但是我们可以通过以下语句给select加共享锁或排他锁。

     

    共享锁:select * from table_name where ..... lock in share mode

    排他锁:select * from table_name where .....for update

    下面我将举例说明【注意:需要关闭自动提交事务 set autocommit = 0

    加入共享锁(我读的时候,你可以读,但是不能写

    事务1

    事务2

    开启事务

    start transaction;

     

    开启事务

    start transaction;

    查询id=1并且加入共享锁

    select  * from test where id = 1 lock in share mode;

     

    查询id=1并且加入共享锁

    select  * from test where id = 1 lock in share mode;

     

    更新此条纪录,发现锁被占用等待

     

    其他事务退出以后 更新成功

     

    也去更新 导致死锁退出

     

     

     

    加入排他锁 这里就不演示了。

     

    具体锁的实现原理

     

    InnoDB行锁是通过给索引项加锁实现的,如果没有索引,InnoDB会通过隐藏的聚簇索引来对记录加锁。

    InnoDB这种行锁实现特点意味着:只有通过索引条件检索数据,InnoDB才使用行级锁,否则,InnoDB将使用表锁!

    行锁分为三种情形:

    Record lock :对索引项加锁,即锁定一条记录。

    Gap lock:对索引项之间的‘间隙’、对第一条记录前的间隙或最后一条记录后的间隙加锁,即锁定一个范围的记录,不包含记录本身 InnoDB使用间隙锁的目的,主要为了防止幻读)

    Next-key Lock:锁定一个范围的记录并包含记录本身(上面两者的结合)。

    注意:InnoDB默认级别是repeatable-read级别,所以下面说的都是在RR级别中的。

    Next-Key Lock是行锁与间隙锁的组合,这样,当InnoDB扫描索引记录的时候,

    当我们用范围条件查询数据会首先对选中的索引记录加上行锁(Record Lock),再对索引记录两边的间隙加上间隙锁(Gap Lock)。如果一个间隙被事务T1加了锁,其它事务是不能在这个间隙插入记录的。

    下面举例说明

    假如数据库有以下3条记录

    比如 我要查询

    Select * frm test where id>2 for update

    这个时候InnoDB不仅会对符合条件的id值为3的记录加锁,也会对id大于3(这些记录并不存在)的“间隙”加锁。

    注意:::

    当我们在使用范围条件检索并锁定记录时,InnoDB这种加锁机制会阻塞符合条件范围内键值的并发插入,这往往会造成严重的锁等待

    因此,尤其是并发插入比较多的应用,

    我们要尽量优化业务逻辑,尽量使用相等条件来访问数据,避免使用范围条件。

  • 相关阅读:
    JSP ——第九次作业
    JSP ——第八次作业
    JSP ——第七次作业-mail_system
    JSP ——第六次作业
    JSP——第五次作业
    软件测试——第二次
    JSP作业 四——2
    JSP 作业 四 —(1)
    JSP 第三次作业
    NSData的同步下载与NSConnection的同步下载
  • 原文地址:https://www.cnblogs.com/javabigdata/p/7612692.html
Copyright © 2011-2022 走看看