Mysql 事务的执行

InnoDB执行行级锁定的方式是,当它搜索或扫描表索引时,会在遇到的索引记录上设置共享或互斥锁。
 

InnoDB 使用的锁类型

  • Shared and Exclusive Locks

    • 共享锁允许锁的持有者读取一行数据。

      • S =>  S + S 

    • 排他锁允许持有者更新或者修改一行。

      • X =>  X + NULL

  • Intention Locks

    • InnoDB允许多种粒度锁定,意向锁是一个表级别的锁,  表明了 事务稍后对表中的各行需要哪种类型的锁。

    • 意图锁定协议如下:

      在事务可以获取表中某行的共享锁之前,它必须首先获取该表中的IS锁或更强的锁。

      在事务可以获取表中某行的排它锁之前,它必须首先获取该表中的IX锁。

    • 如果锁与现有锁兼容,则将其授予请求的事务,但如果与现有锁冲突,则不授予锁。 事务等待直到冲突的现有锁被释放。 如果锁定请求与现有锁定发生冲突,并且由于可能导致死锁而无法被授予,则会发生错误。

  • Record Locks

    • 记录锁定是对索引记录的锁定, 防止任何其他事务插入,更新或删除这条记录。

    • 行级锁实际上是索引记录锁

  • Gap Locks

    • 间隙锁定是对索引记录之间的间隙的锁定,或者是对第一个或最后一个索引记录之前的间隙的锁定。

    • 间隙锁是性能和并发性之间权衡的一部分,并且在某些事务隔离级别而非其他级别中使用。

    • 使用唯一索引锁定行以搜索唯一行的语句不需要间隙锁定。说的是使用一个Unikey Key 的 语句。

    • 如果条件语句 指定的列 未建立索引或具有非唯一索引,则该语句会锁定前面的间隙。

    • 对于多个事务,允许建立在同区间上的 任意类型的 Gap Locks 。

  • Next-Key Locks

    • 下键锁,是这个索引上的记录锁,和这条索引记录之前的间隙锁的组合。

    • 解释:如果一个会话在索引中的记录R上具有共享或排他锁,则另一会话不能按照索引顺序在R之前的间隙中插入新的索引记录。

  • Insert Intention Locks

    • 插入意图锁是在行插入之前通过INSERT操作设置的间隙锁的一种。 此锁发出插入意图的信号是,如果多个事务未插入间隙中的相同位置,则无需等待插入到同一索引间隙中的多个事务。

    • 解释 :假设有索引记录,其值分别为4和7。A,B 事务分别尝试插入值5和6,在获得插入行的排他锁之前,A,B事务都使用插入意图锁来锁定4和7之间的间隙, 但不要互相阻塞,因为行是无冲突的。
       

  • AUTO-INC Locks

    • AUTO-INC锁是一种特殊的表级锁,由事务插入具有AUTO_INCREMENT列的表中获得。 在最简单的情况下,如果一个事务正在向表中插入值,那么任何其他事务都必须等待自己在该表中进行插入,以便第一个事务插入的行接收连续的主键值。

  • Predicate Locks for Spatial Indexes

    • 空间索引的谓词锁

    • 为了处理涉及SPATIAL索引的操作的锁定,下键锁定不能很好地支持REPEATABLE READ或SERIALIZABLE事务隔离级别。 多维数据中没有绝对排序概念,因此尚不清楚哪个是“下一个”键。

      为了支持具有SPATIAL索引的表的隔离级别,InnoDB使用谓词锁。 SPATIAL索引包含最小边界矩形(MBR)值,因此InnoDB通过在用于查询的MBR值上设置谓词锁定来强制对索引进行一致的读取。 其他事务不能插入或修改将匹配查询条件的行。

InnoDB 的 事务模型

14.7.2.1 Transaction Isolation Levels

14.7.2.2 autocommit, Commit, and Rollback

14.7.2.3 Consistent Nonlocking Reads

14.7.2.4 Locking Reads

1. 事务的隔离水平用来什么?

        隔离级别是一种设置,用于在多个事务同时进行更改和执行查询时    微调性能与结果的可靠性,一致性和可重复性之间的平衡。

2. 隔离级别如何实现它的目标?

         隔离级别通过使用不同的锁类型,实现微调。

3.隔离级别有哪些,以及隔离级别对应的锁类型是什么?

         1.  REPEATABLE READ :默认情况下,InnoDB在REPEATABLE READ事务隔离级别中运行。 可重复读,意味者同一事务中的 重复执行 某一条select 语句,会得到相同的结果。

  • 在这种情况下,InnoDB使用next-key锁定进行搜索和索引扫描。
  • 一致非锁定读取 是 InnoDB 在 READ COMMITTED和  REPEATABLE READ  隔离级别中处理SELECT语句的默认模式。一致读取不会在它访问的表上设置任何锁,因此其他会话可以在对该表执行一致读取的同时自由地修改那些表。
  • 如果事务隔离级别为REPEATABLE READ(默认级别),则同一事务中的 所有 一致读取【select 语句 】 将 读取 该事务中第一个此类读取所建立的快照。
  • 一致非锁定的读取意味着InnoDB使用多版本在 某个时间点 向  查询 呈现数据库快照。该查询将看到在该时间点之前提交的事务所做的更改,而看不到以后或未提交的事务所做的更改。该规则的例外是查询可以看到同一事务中较早的语句所做的更改。此意外导致以下意外:如果更新表中的某些行,则SELECT会看到更新后的行的最新版本,但可能还会看到任何行的旧版本。如果其他会话同时更新同一张表,则异常意味着您可能会以数据库中不存在的状态查看该表
  •  2. READ COMMITTED  禁用了Gap Locks
    • 使用这个隔离级别的话,采用的读取模式是 锁定读取
      • 使用锁定读取,并且对于UPDATE或DELETE语句,InnoDB仅对其读取,更新或删除的行持有锁。 MySQL评估WHERE条件后,将释放不匹配行的记录锁。这大大降低了死锁的可能性,但是仍然可以发生。
      • 当同一查询在不同时间生成不同的行集时,在事务内就会发生所谓的幻像问题。 例如,如果SELECT执行两次,但是第二次返回的行却不是第一次返回,则该行是“幻像”行。

 

         

    

你可能感兴趣的:(Mysql 事务的执行)