在同一个session上,为了保持数据一致性,若表中有行锁,
select * from t for update 会等待行锁释放之后,返回查询结果。
select * from t for update nowait 不等待行锁释放,提示锁冲突,不返回结果
select * from t for update wait 5 等待5秒,若行锁仍未释放,则提示锁冲突,不返回结果
select * from t for update skip locked 查询返回查询结果,但忽略有行锁的记录
由上述比较看来, nowait 不返回记录,而返回冲突信息; skip locked 返回查询结果,并忽略行锁记录
在Oracle 9i, 10g中, select * from t for update nowait skip locked; 这样的查询,既要求提示冲突不返回记录,又要求忽略行锁记录返回查询结果;执行结果与
select * from t for update skip locked 一致, nowait的作用实际上被屏蔽了。
我们可以认为上述语句是Oracle查询编译语句的bug,但无伤大雅。但我们知道, nowait 与 skip locked 在语义上应该是互斥的。
在Oracle 11g中,select * from t for update nowait skip locked是错误的,用户必须显示指定是nowait 还是 skip locked, 而不能同时提供两者,让查询编译器来决定到底是哪个。
select * from t for update 会等待行锁释放之后,返回查询结果。
select * from t for update nowait 不等待行锁释放,提示锁冲突,不返回结果
select * from t for update wait 5 等待5秒,若行锁仍未释放,则提示锁冲突,不返回结果
select * from t for update skip locked 查询返回查询结果,但忽略有行锁的记录
由上述比较看来, nowait 不返回记录,而返回冲突信息; skip locked 返回查询结果,并忽略行锁记录
在Oracle 9i, 10g中, select * from t for update nowait skip locked; 这样的查询,既要求提示冲突不返回记录,又要求忽略行锁记录返回查询结果;执行结果与
select * from t for update skip locked 一致, nowait的作用实际上被屏蔽了。
我们可以认为上述语句是Oracle查询编译语句的bug,但无伤大雅。但我们知道, nowait 与 skip locked 在语义上应该是互斥的。
在Oracle 11g中,select * from t for update nowait skip locked是错误的,用户必须显示指定是nowait 还是 skip locked, 而不能同时提供两者,让查询编译器来决定到底是哪个。