MySQL 中 FOR SHARE 和 FOR UPDATE 的区别

5 阅读1分钟

主要区别

  1. 锁的类型

    • FOR UPDATE:施加排他锁(X锁)
    • FOR SHARE:施加共享锁(S锁)
  2. 并发行为

    • FOR UPDATE:其他事务不能对被锁定的行进行修改,也不能使用 FOR UPDATE 锁定这些行
    • FOR SHARE:其他事务不能修改被锁定的行,但可以读取并使用 FOR SHARE 锁定这些行

用途对比

  • FOR UPDATE:适用于需要修改数据的场景,确保在读取后到更新前数据不会被其他事务修改
  • FOR SHARE:适用于需要确保数据一致性但不需要修改数据的场景,允许多个事务同时读取

具体行为

以下查询在两个不同事务中同时执行:

-- 事务1
SELECT * FROM orders WHERE id = 100 FOR UPDATE;

-- 事务2
SELECT * FROM orders WHERE id = 100 FOR UPDATE; -- 会被阻塞,直到事务1释放锁
-- 事务1
SELECT * FROM orders WHERE id = 100 FOR SHARE;

-- 事务2
SELECT * FROM orders WHERE id = 100 FOR SHARE; -- 可以执行,共享锁可以共存
UPDATE orders SET status = 'shipped' WHERE id = 100; -- 会被阻塞