FOR UPDATE SKIP LOCKED
SYS_UNIT 中有UNIT_ID
0000000001
0000000002
0000001100
原意为若启用多线程,则每个线程在获取时仅可以获取一条数据(互斥)
脚本如下
1、SELECT * FROM SYS_UNIT s
where s.unit_id=(
SELECT unit_id FROM (
SELECT * FROM SYS_UNIT T ORDER BY T.UNIT_ID ASC
) A WHERE ROWNUM<=1
)
FOR UPDATE of s.unit_id SKIP LOCKED
测试时,一个能获取 0000000001 另外一个则为空(当启用两个session时)
猜猜:第一个session A 根据子查询获取 第一行数据 用外层查询得出第一条数据被加锁
第二个Session B 根据子查询获取第一行数据,用外部查询得出第一条数据,又因为Skip lock 丢弃,顾查询不到任何数据了
使用
SELECT * FROM SYS_UNIT T
where unit_id='0000000002' FOR UPDATE SKIP LOCKED
发现还是能获取到数据的,但是如果是
SELECT * FROM SYS_UNIT T
where unit_id='0000000001' FOR UPDATE SKIP LOCKED
则获取不到数据
证明猜猜是正确的