什么是 FOR UPDATE NOWAIT?
FOR UPDATE NOWAIT 是 SQL 中用于在查询时对选中行加排他锁(exclusive lock)的一种语法扩展。
它常见于支持行级锁定的数据库系统,如 Oracle、PostgreSQL 等。
与普通的 FOR UPDATE 不同,NOWAIT 选项会在无法立即获取锁时直接报错,而不是等待。
基本语法
SELECT * FROM table_name WHERE condition FOR UPDATE NOWAIT;
与 FOR UPDATE 的区别
- FOR UPDATE:如果目标行已被其他事务锁定,当前查询会阻塞,直到锁被释放。
- FOR UPDATE NOWAIT:如果目标行已被锁定,数据库立即返回错误(例如 Oracle 报 ORA-00054),不等待。
使用场景
适用于需要快速失败(fail-fast)策略的应用场景,例如:
- 高并发系统中避免线程长时间挂起
- 实时性要求高的业务逻辑
- 防止死锁或资源争用导致的性能下降
注意事项
- 并非所有数据库都支持
NOWAIT(如 MySQL 的 InnoDB 引擎不支持标准的NOWAIT,但可通过SKIP LOCKED或超时设置模拟)。 - 使用时需确保应用层能正确处理锁冲突异常。
- 事务结束后(提交或回滚),锁会自动释放。
示例(Oracle / PostgreSQL)
-- 尝试锁定用户ID为100的记录,若已被锁则立即报错
SELECT * FROM users WHERE id = 100 FOR UPDATE NOWAIT;