MySQL的行锁和表锁

简单总结一下行锁和表锁。并发

  • 行锁 每次操做锁住一行数据。开销大,加锁慢;会出现死锁;锁定粒度最小,发生锁冲突的几率最低,并发度也最高。
  • 表锁 每次操做锁住整张表。开销小,加锁快;不会出现死锁;锁定粒度大,发生锁冲突的几率最高,并发度最低。

使用行锁或表锁都是使用的悲观锁:SELECT ...FOR UPDATE。 当查询有明确的主键时使用的是行锁;查询无明确主键时使用表锁。 注意要使用InnoDB引擎。 银行、库存中会用到,这里以商品库存为例。product表中,id为主键,商品名称为name。code

1. 明确指定主键,而且有结果集,Row_Level Lock, 行锁。
      如:SELECT * FROM product WHERE id='5' FOR UPDATE;
      2. 明确指定主键,而且无结果集,无Lock,不会上锁。
      如:SELECT * FROM product WHERE id='-100' FOR UPDATE;
      3. 无主键 Table-Level Locl,会锁表。
       如:SELECT * FROM product WHERE name='xiaomi' FOR UPDATE;
      4. 主键不明确,Table-Level Lock,会锁表。
      如:SELECT * FROM product WHERE id <> '5' FOR UPDATE;
      如:SELECT * FROM product WHERE id LIKE '5' FOR UPDATE;
相关文章
相关标签/搜索