InnoDB 存储引擎

行锁

  • 共享锁(S)
    • 多个事务可以加共享锁读同一行数据,但是别的事务不能写改行
  • 排他锁(X)
    • 一个事务加排他锁写一行数据,其他事务只能读改行数据
  • 共享锁和排他锁是互斥

表锁

  • 意向共享锁
  • 意向排他锁

**

select 默认不会上锁

  • 由于 innodb 实现了可重复度
    • 只会基于 mvcc 机制,根据行的事务id进行判断

间隙锁

简介

  • 使用范围条件检索数据,请求共享锁或排他锁时

    • innodb 会给符合条件的已有数据记录的索引项加锁
    • 符合条件的但不存在的数据记录的索引项加锁,即加了间隙锁 (next-key 锁)
      • 该不存在的记录叫做 间隙 (GAP)

        危害

  • 范围条件检索数据时,会锁定整个范围内所有的索引键值,即使该键值不存在

    • 锁定时,无法插入锁定键值范围内的任何数据

**

加入锁时机

行锁

共享锁

  • innodb 不会主动 加共享锁
  • 只能手动加共享锁(不要对某段数据加锁修改时),在 select 语句后面加 lock in share mode

    排他锁

  • insert, update, delete , innodb 自动给对应的行加行级排他锁

  • 可以手动加排他锁, 在对应的 select、 insert、update、delete 加入 for update

    • 慎用

      表锁

  • 加入行共享锁时,必须给表加意向共享锁

  • 加入行排他锁时,必须给表加意向排他锁
  • Innodb 存储引擎自动加
  • 无索引行锁会升级为表锁

**

乐观锁和悲观锁

  • 悲观锁
    • insert, update, delete 默认加行级排他锁
    • select 加 for update
    • 可能导致死锁
  • 乐观锁
    • 用版本号字段,会进行版本号判断