事务
ACID
- 原子性:事务要么全部执行要么全部回滚
- 一致性:事务执行前和执行后系统处于一致状态,比如AB之间转账,AB总钱数不能变
- 持久性:事务一旦完成将会被持久保存
- 隔离性:事务执行相互隔离互不影响,看起来就像串行化的
事务隔离级别
- 读未提交RU
- 读已提交RC
- 可重复读RR
- 串行化SERIALIZABLE
Mysql事务和锁
1.锁
锁的模式:
- 意向锁(表级):用来兼容表锁和记录锁支持多粒度锁并存
- 共享锁(表行):
- 独占锁(表行):
- LOCK_AUTO_INC锁 (表级)(独占)
锁类型:
- table
- record
记录锁类型:锁类型为record使用
- LOCK_ORDINARY(NEXT_KEY):GAP+LOCK_REC_NOT_GAP
- LOCK_GAP:锁住索引的空白的间隙不包括行记录(该锁的共享锁和独占锁没有区别)
- LOCK_REC_NOT_GAP:锁住索引的行记录
- LOCK_INSERT_INTENTION:是一种GAP锁并不是真正的意向锁,用于插入时使用,不会阻塞其他锁,会被gap锁阻塞。类似意向锁兼容插入时的行锁和gap锁
2.事务和锁
RU:普通读为当前读
RC:RECORD,普通读为快照读(每次读取都会生成新的快照,所以不能重复读)
-
主键索引:
- 等值:存在直接主键加锁、不存在不加锁
- 范围:先对主键依次扫描,扫描到不符合条件的记录锁释放掉
-
唯一索引
- 等值:存在对唯一索引加锁并对主键加锁、不能存在不加锁
- 范围:同1.1,对非唯一索引加锁并对主键加锁
-
非唯一:同2
-
无索引:依次对主键加锁,不符合条件则释放锁
RR:RECORD+GAP+NEXT_KEY,普通读为快照读(在第一次select时生成快照之后每次查询不会更新快照,在当前事务中对数据修改才会更新快照。可以重复读和防止幻读)
-
主键索引:
- 等值:
- 有满足条件的行:行锁
- 没有满足条件的数据:没有则gap锁防止幻读(select for update)、不加锁(update … where id=?)
- 范围:next_key
- 等值:
-
唯一索引
- 等值:
- 有满足条件的行:行锁
- 没有满足条件的行:没有则gap锁防止幻读(select for update)、不加锁
- 范围:对唯一索引加next_key对主键加record
- 等值:
-
非唯一:对非唯一索引加next_key并对主键加record
-
无索引:锁全表
SE:RECORD+GAP+NEXT_KEY, 普通读为当前读加共享锁