menu

Junjielee Blog

在平凡中坚持前行,总会遇见不凡的自己

MySQL锁机制

针对并发操作,容易产生的一下四种问题,有了锁的概念:

  • 不可重复读:在两次读数据之间,修改了数据
  • 更新丢失:同时更新数据,导致覆盖。
  • 脏读:A操作执行后未提交,B操作读取了数据,然后A操作回滚
  • 幻读:A事务第二次读取数据前,B事务提交了数据,读了B最新的数据

于是有了锁:页锁、表锁、行锁

锁模式

  • 共享锁:允许一个事务取读,不允许其他事务获取相同数据集的排他锁
  • 排他锁:允许获取排他锁的事务更新,不允许其他事务获取相同数据集的共享锁和排他锁
  • 间隙锁:给查询和写入操作中,一些不存在的记录加锁

共享和排他锁可以是行锁和表锁。而间隙锁则只能是行锁

MyISAM锁

MyISAM引擎只支持表锁,在执行SQL语句时,会自动为SELECT语句加上共享锁,为写操作加上排他锁

InnoDB锁

InnoDB支持行锁和表锁,行锁是通过给索引上的索引项加锁实现的,所以只有通过索引条件检索数据,才使用行锁,否则,使用表锁

所有有时候,虽然两个查询不是使用相同的行,但使用相同的索引,也会出现锁冲突