Mysql事务和锁

事务

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. 范围:先对主键依次扫描,扫描到不符合条件的记录锁释放掉
  2. 唯一索引

    1. 等值:对唯一索引加锁并对主键加锁
    2. 范围:同1.1,对非唯一索引加锁并对主键加锁
  3. 非唯一:同2

  4. 无索引:依次对主键加锁,不符合条件则释放锁

RR:RECORD+GAP+NEXT_KEY,普通读为快照读(在第一次select时生成快照之后每次查询不会更新快照,在当前事务中对数据修改才会更新快照。可以重复读和防止幻读)

  1. 主键索引:

    1. 等值:有满足条件则行锁没有则gap锁防止幻读
    2. 范围:next_key
  2. 唯一索引

    1. 等值:next_key
    2. 范围:对唯一索引加next_key对主键加record
  3. 非唯一:同3

  4. 无索引

SE:RECORD+GAP+NEXT_KEY, 普通读为当前读加共享锁

参考文档

  1. Mysql锁
  2. Mysql锁系统
  3. Mysql锁官网介绍

你可能感兴趣的:(中间件)