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. 等值:
      1. 有满足条件的行:行锁
      2. 没有满足条件的数据:没有则gap锁防止幻读(select for update)、不加锁(update … where id=?)
    2. 范围:next_key
  2. 唯一索引

    1. 等值:
      1. 有满足条件的行:行锁
      2. 没有满足条件的行:没有则gap锁防止幻读(select for update)、不加锁
    2. 范围:对唯一索引加next_key对主键加record
  3. 非唯一:对非唯一索引加next_key并对主键加record

  4. 无索引:锁全表

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

参考文档

  1. Mysql锁
  2. Mysql锁系统
  3. Mysql锁官网介绍
  4. insert 加锁
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值