事务本质
事务定义
- 数据库管理系统执行过程中的一个逻辑单位,由一个有限的数据库操作序列构成
- 事务的核心就是锁与并发控制
事务特性
- 原子性:事务被一个整体执行,包含的操作要么全做、要么全不做
- 一致性:事务开始执行前后,数据库都处于一致状态,确保数据库的状态从一个一致状态转变为另一个一致状态。
- 隔离性:多个独立事务之间相互交互的程度,决定多个事务怎样保护未提交的数据。
- 持久性:事务成功提交之后,它对数据库的更改将永久被保存
事务隔离级别
- 未提交读:事务中的修改即使没有提交也对其他事务可见。
- 提交读:事务内只能看到其他已经提交的事务结果。
- 可重复读:只允许读取已经提交的数据,而且在一个事务两次读取一个数据项期间,其它事务不得更新该数据。
- 序列读:最高的隔离级别,事务串行执行
事务总结
事务单元操作类型
事务并发问题
- 更新丢失:当两个不同的事务试图同时更新数据库中同一行上的同一列时,会发生丢失更新
- 脏读:即事务可以读取未提交的数据,写与读不互斥。
- 不可重复读:即同一个事务多次查询得到不一致的结果,读写不互斥
- 幻读:当某个事物在读取某个范围内的记录时,另外一个事务又在该范围内插入了新的记录,当之前的事务再次读取该范围的记录时,会产生幻行
事务特性理解
- 隔离性与一致性:是一致性与并发之间的杠杆,隔离级别增加,一致性增加,并发性能降低。隔离线打破了一致性。
- 原子性与一致性:两者没有必然联系,原子性保证的事务操作要么全做、要么全不做,对每个操作按时间做记录,以便回滚操作,一致性保持的数据状态变更,中间状态对外部不可见
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对于行的扫描锁定都是使用此算法,但是如果查询扫描中有唯一索引会退化成只使用记录锁
- 解决幻读
插入意向锁
- 插入意向锁是在插入的时候产生的,在多个事务同时写入不同数据至同一索引间隙的时候,并不需要等待其他事务完成,不会发生锁等待
- 如果有间隙锁了,插入意向锁会被阻塞