MySQL|从事务到InnoDB锁深度剖析

 

目录

1.什么是事务?

2.事务的4大特性

3.并发情况下隔离性的设定问题。

4.事务的4种隔离级别

5.表锁   和   行锁

6.InnoDB中锁的分类

7.InnoDB中行锁和表锁这两种加锁的区别

8.表锁算法


   

     听过Mysql的人可能都知道,MySQL的存储引擎有很多,如MyISAM,InnoDB,MEMORY,ARCHIVE等。但是只有InnoDB才支持事务,今天我们就来一起探讨一下InnoDB存储引擎。

1.什么是事务?

         事务是数据库操作的最小执行单元(不可再分割),是作为单个逻辑单元执行的一系列操作。

2.事务的4大特性

          原子性:最小的工作单元,整个工作单元要么一起提交成功,要么全部失效回滚。

         一致性:事务中操作的数据改变是一致的。(最终结果的准确性)

          隔离性:事务内所操作的数据在提交前对其他事务的可见性设定。

         持久性:事务所做的修改会永久保存,不会因为系统意外导致数据的丢失。(redo log重做日志保持持久性)

3.并发情况下隔离性的设定问题。

         多个事务在并行处理时,某一个事务在处理,再该事务提交之前,对其他事务可见性的设定。

         会导致一下几种情况:

  •          脏读
  •           不可重复读(第1次跟第2次读到的数据不一样)
  •          幻读(第一次读取数据和第二次读取数据的范围不同)

4.事务的4种隔离级别

  • 未提交读:未解决事务的并发问题。事务未提交对其他事务是可见的,产生脏读。
  • 提交读:解决了脏读问题。一个事务开始之后,只能看到自己提交的事务所做的修改,可以重复读。
  • 可重复读:解决不可重复读问题。在同一事务中多次读取同样的数据结果是一样的。
  • 串行化:解决所有问题。最高隔离级别,通过强制事务的串行执行。

下面通过一个表来让大家更加容易理解四种隔离级别:

MySQL|从事务到InnoDB锁深度剖析_第1张图片

为什么可重复读级别对InnoDB不可能产生幻读呢,因为InnoDB在可重复读级别默认加上了临键锁,下面会讲到临键锁。

5.表锁   和   行锁

    锁定粒度:表锁  >  行锁

    加锁效率:表锁 >   行锁

    冲突概率:表锁 >   行锁

    并发性能:表锁 < 行锁

6.InnoDB中锁的分类

   (1)共享锁:读锁(S锁)

    多个事务对于同一个数据库可以共享访问,但是不能操作修改。

   例如:select * from student where id = 1 lock in share mode     加锁

              commit/rollback   释放锁

   (2)排他锁:写锁(X锁),互斥锁/独立锁

    事务获取了一个数据的X锁,其他的事务就不能再获取该行的锁,X锁,S锁都不行。只有获取了X锁的事务才能对数据行进行读取和修改。

    delete/update/insert 默认加上X锁

   例如:select * from student where .....for update     加锁

              commit/rollback                                           释放锁

7.InnoDB中行锁和表锁这两种加锁的区别

    (1)InnoDB的行锁通过索引的索引项加锁来实现的。举个例子来说,对主键索引或者唯一键索引加锁加的就是行锁。

    (2)通过索引进行数据检索,InnoDB才使用行级锁,不然使用表级锁,例如对普通的字段加锁就是表锁。

8.表锁算法

   (1)临键锁(Next-Key Lock)

      需要遵守下面的三个条件:

  •                当SQL执行时按照索引进行数据检索时;
  •                查询条件为范围查找(between and, <  ,  >等)
  •                有数据命中时,该SQL语句加上的锁为临建锁

   锁住命中记录空间+下一个区间(左边右开)

        所以InnDB在不可重复读的级别不会发生幻读,命中空间和下一个空间被临建锁锁住了,其他事务无法进行增,删操作,所以两次读取数据的范围不变,即不会幻读。

     (2)间隙锁(Gap Locks)  

 

    需要遵守下面的2个条件:

  •                当SQL执行时按照索引进行数据检索时;
  •                查询条件的数据不存在

锁住数据不存在的区间(左开右开)

    (3)记录锁

    就如名称一样,锁住语句中字段的数据行。

    

你可能感兴趣的:(MySQL)