Innodb 事务与锁


事务本质

事务定义

  • 数据库管理系统执行过程中的一个逻辑单位,由一个有限的数据库操作序列构成
  • 事务的核心就是锁与并发控制

事务特性

  • 原子性:事务被一个整体执行,包含的操作要么全做、要么全不做
  • 一致性:事务开始执行前后,数据库都处于一致状态,确保数据库的状态从一个一致状态转变为另一个一致状态。
  • 隔离性:多个独立事务之间相互交互的程度,决定多个事务怎样保护未提交的数据。
  • 持久性:事务成功提交之后,它对数据库的更改将永久被保存

事务隔离级别

  • 未提交读:事务中的修改即使没有提交也对其他事务可见。
  • 提交读:事务内只能看到其他已经提交的事务结果。
  • 可重复读:只允许读取已经提交的数据,而且在一个事务两次读取一个数据项期间,其它事务不得更新该数据。
  • 序列读:最高的隔离级别,事务串行执行

事务总结

事务单元操作类型

  • 读读
  • 读写
  • 写读
  • 写写

事务并发问题

  • 更新丢失:当两个不同的事务试图同时更新数据库中同一行上的同一列时,会发生丢失更新
  • 脏读:即事务可以读取未提交的数据,写与读不互斥。
  • 不可重复读:即同一个事务多次查询得到不一致的结果,读写不互斥
  • 幻读:当某个事物在读取某个范围内的记录时,另外一个事务又在该范围内插入了新的记录,当之前的事务再次读取该范围的记录时,会产生幻行

事务特性理解

  • 隔离性与一致性:是一致性与并发之间的杠杆,隔离级别增加,一致性增加,并发性能降低。隔离线打破了一致性。
  • 原子性与一致性:两者没有必然联系,原子性保证的事务操作要么全做、要么全不做,对每个操作按时间做记录,以便回滚操作,一致性保持的数据状态变更,中间状态对外部不可见

Innodb 锁

共享锁与排他锁

  • 共享锁:共享(S)锁允许持有该锁的事务读取一行记录。
  • 排他锁:独占(X)锁允许持有该锁的事务更新或删除行。
  • 如果事务T1在记录R持有了共享锁S,那么另外一个事务T2对记录R请求共享锁会被立即获得,T1与T2 同时持有共享锁,若获取一个独占锁X,那么不会被立即允许

意向锁

  • 意向锁是一种表级锁,锁的粒度是整张表,分为意向共享锁(IS)和意向排他锁(IX)
  • 一个事务必须先持有该表上的 IS 或者更强的锁才能持有该表中某行的 S 锁
  • 一个事务必须先持有该表上的 IX 锁才能持有该表中某行的 X 锁

锁兼容矩阵

记录锁

  • 对索引记录的锁定。
  • 如果表没有索引,也没有主键(这种情况下,InnoDB会创建隐式的索引,并使用这个索引实施记录锁)。
  • 如果锁的是非主键索引,会在自己的索引上面加锁之后然后再去主键上面加锁锁住

间隙锁

  • 锁的是索引记录的间隙,不锁记录本身,锁位置,只锁住一段范围,一般在RR隔离级别下会使用到GAP锁
  • 唯一索引不存在间隙
  • 间隙锁时被抑制的,会抑制其他事务插入到间隙中,但是不会阻止其他事务在同一个间隙上获得间隙锁

next-key

  • 这个锁本质是记录锁加上gap锁。在RR隔离级别下(InnoDB默认),Innodb对于行的扫描锁定都是使用此算法,但是如果查询扫描中有唯一索引会退化成只使用记录锁
  • 解决幻读

插入意向锁

  • 插入意向锁是在插入的时候产生的,在多个事务同时写入不同数据至同一索引间隙的时候,并不需要等待其他事务完成,不会发生锁等待
  • 如果有间隙锁了,插入意向锁会被阻塞


上篇: 下篇: Lambda表达式
Comments