mysql数据库锁

  1. 共享锁S和独占锁X:事务a和事务b在同一时间内请求的执行顺序,事务a和事务b同时可以获取共享锁s,独占锁要轮流来获取,先到先得。
  2. 意向锁(查表):
    • 有类型兼容性:
    • 目的:有人正在锁定一行,或将要锁定表中的一行。
    • 作用:阻止全表查询,其他放过。
    • 级别:表级锁
    • 类型:
      • 共享锁IS(各行)
      • 排他锁IX(各行)
    • 协议:
      • 获取行的共享锁之前,需要先获取共享锁表上的锁或者更强的锁
      • 获取行的共享锁之前,需要先获取排他锁表上的锁
        mysql数据库锁_第1张图片
  3. 记录锁(查行):
    • 锁:索引记录上的锁
    • 实现:select c1 from t where c1 = 100 for update,防止其他事务插入,更新,删除数据c1=100的行
    • 没有索引会使用隐藏索引。
  4. 间隙锁(查询范围):
    • 锁:第一个索引记录之前或者最后一个索引记录之后的间隙的锁定。
    • 实现:select c1 from t where c1 between 10 and 20 for update
    • 使用唯一索引不需要使用。
    • 目的:防止其他事务插入数据到间隙中。
    • 兼容:可共存。
    • 不同事务可以在间隙上持有冲突锁,因为如果需要清除记录,则需要合并不同事务在该记录上持有的间隙锁。
    • 可被显示禁用。
  5. 下一钥匙锁(查询in):索引记录上的记录锁和索引记录之前的间隙上的间隙锁的组合
    • 如果一个会话对一个索引中的记录具有共享锁或者独占锁,那么另一个会话咋无法在索引顺序中紧邻之前的间隙中插入新的索引记录。
    • 在事务隔离级别rr下,使用下一键锁进行搜索和索引扫描,可以防止幻像行。
    • 不是很理解,这个类似一个in查询,但是锁定了in里面id 之间的范围,阻止了这些范围内会话执行insert的行为。好像就是这样。
  6. 插入意向锁(同时插入的锁)
    • 锁类型:间隙锁,由insert行插入之前的操作设置。
    • 表明插入的意图:如果没有插入间隙内的同一个位置,则不需要互相等待。
    • 简单讲就是事务a插入了一些数据,事务a也插入了一些数据,只要插入的不是同一个记录id,那就不需要互相等待。这个获取插入意向锁是在获取排他锁之前,如果有排他锁,虽然不是同一个记录,还是会被排他锁限制。反过来就是说,如果两个事务都是插入同一个记录,则会导致冲突,互相阻塞,这时候插入意向锁被锁定。大概是这样子。mysql数据库锁_第2张图片
  7. auto-inc锁:如果一个事务正在将值插入表中,则任何其他事务都必须等待才能向该表中执行自己的插入操作,以便第一个事务插入的行接收连续的主键值。
  • 主键
  • 主要是参数innodb_autoinc_lock_mode 有三个值
    • 0 这个表示tradition 传统,对insert语句一直锁定。
    • 1 这个表示consecutive 连续,不会对insert一直锁定。
    • 2 这个表示interleaved 交错,没有锁,性能最好,但,id可能不是连续的。
  1. 空间索引的谓词锁(略)

你可能感兴趣的:(SQL,数据库,mysql)