主要区别
-
锁的类型:
FOR UPDATE
:施加排他锁(X锁)FOR SHARE
:施加共享锁(S锁)
-
并发行为:
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; -- 会被阻塞