主要区别
-
锁的类型:
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; -- 会被阻塞