Qianfeng

DON'T WORRY BE HAPPY
  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

MySQL数据库事务隔离机制:实现

Posted on 2022-03-14 21:55  RonnieOS  阅读(110)  评论(0编辑  收藏  举报

事务隔离是为了解决事务并发的读一致性问题?如何保证在一个事务里多次读到的数据一样?

  1. 基于锁的并发控制(LOCK BASED CONCURRENCY CONTROL)
  2. 生成一致性数据快照(snapshot),这个叫(multi version concurrency control>,简称MVCC

两个行级别的锁:

  1. 共享锁(读锁)LOCK IN SHARE MODE
  2. 排他锁(写锁)。delete, update, insert自动加入排他锁。如果主动加,关键字是 FOR UPDATE。一个事务获得了排他锁其他事务就不能获得了

两个表级别的锁:

  1. 意向共享锁:数据引擎自己维护的,用户没有办法自己操作。给某行加共享锁,必须先对表加意向排他锁
  2. 意向排他锁:给某行加共享锁,必须先对表加意向排他锁

事务给某张表加上表锁的前提:没有任何其他事务已经锁定了任意一行数据.所以意向锁的用处是为了提高加表锁的检查效率

一个表只能有一个聚集索引!!
聚集索引:索引的逻辑顺序 = 数据物理顺序

  1. 如果定义了PRIMARY KEY, 那主键索引就是聚集索引
  2. 如果没有主键索引,那么第一个UNIQUE KEY会被用作聚集索引
  3. 如果都没有,那么会用_rowid建立为聚集索引

聚集索引:叶子节点存储索引和数据
二级索引:叶子节点存储索引和主键
锁的作用:锁锁的是索引项

  1. 表没有索引,为什么会锁表?
    涉及到全表扫描
  2. 表既有PRIMARY KEY, 又有UNIQUE KEY
    PRIMARY KEY是聚集索引,UNIQUE KEY不是聚集索引,是二级索引。

记录锁:
唯一性索引等值查询,并且检索到了
select * from orders where order_num = 3 for update;
间隙锁:
检索到间隙上去了(不存在数据).间隙排他锁是不冲突的(反正都检索不到数据).
间隙锁的作用是,阻塞插入间隙
临键锁:
范围查询既包含记录,又包含间隙.
会锁定多个区间.

innodb用临键锁使得可重复读,不会出现幻读问题