SELECT ... FOR UPDATE
和 LOCK TABLES
都是用来处理并发操作时锁定数据库表的方法,但它们的使用场景和效果有所不同。
-
SELECT ... FOR UPDATE
:- 主要用于在事务中锁定选中的记录。它确保在当前事务完成之前,其他事务不能修改或删除这些记录。适用于需要对特定行进行修改的情况。
- 示例:假设你有一个表
accounts
,需要转账时锁定特定的记录:START TRANSACTION; SELECT balance FROM accounts WHERE account_id = 1 FOR UPDATE; -- 执行更新操作 UPDATE accounts SET balance = balance - 100 WHERE account_id = 1; COMMIT;
-
LOCK TABLES
:- 主要用于在事务中对整个表进行锁定。这种锁定会阻止其他事务对整个表进行读或写操作,适用于需要对表进行批量操作时。
- 示例:假设你需要对整个表进行操作:
LOCK TABLES accounts WRITE; -- 执行表级操作 UPDATE accounts SET balance = balance - 100 WHERE account_id = 1; UNLOCK TABLES;
总结:
- 使用
SELECT ... FOR UPDATE
可以在行级别上加写锁,适用于对特定记录进行操作的场景。 - 使用
LOCK TABLES
则会对整个表加锁(写锁或读锁),适用于需要对整个表进行操作的场景。