简单总结一下行锁和表锁。并发
使用行锁或表锁都是使用的悲观锁: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;