Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/86.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql Oracle虚拟列或函数,用于在特定行上发现锁_Sql_Oracle_Locking_Rows - Fatal编程技术网

Sql Oracle虚拟列或函数,用于在特定行上发现锁

Sql Oracle虚拟列或函数,用于在特定行上发现锁,sql,oracle,locking,rows,Sql,Oracle,Locking,Rows,Oracle是否提供类似虚拟列的内容来查看行的锁定状态 换句话说,我正在寻找一个像LOCKED\u STATUS这样的属性来区分表的锁定行和未锁定行,就好像我们可以运行以下查询一样 不要与update skip locked的子句混淆,这使得查询不可编译,但它的出现只是为了强调我查找指定结果集的意图 with all_unlocked (LOCKED_STATUS, TITLE, ROW_ID) AS ( select 'N' AS LOCKED_STATUS, T.T

Oracle是否提供类似虚拟列的内容来查看行的锁定状态

换句话说,我正在寻找一个像
LOCKED\u STATUS
这样的属性来区分表的锁定行和未锁定行,就好像我们可以运行以下查询一样

不要与update skip locked的
子句混淆,这使得查询不可编译,但它的出现只是为了强调我查找指定结果集的意图

  with 
    all_unlocked (LOCKED_STATUS, TITLE, ROW_ID) AS (
      select 'N' AS LOCKED_STATUS, T.TITLE, T.ROWID
        from my_table T
         for update skip locked /*DOES NOT COMPILE*/ 
    ),
    all_locked (LOCKED_STATUS, TITLE, row_id) AS (
      select 'Y' AS LOCKED_STATUS, A.TITLE, A.ROWID
        from my_table A 
       where not exists (select null 
                           from all_unlocked B 
                          where B.row_id = A.rowid)
    )
  select * from all_unlocked
    union all 
  select * from all_locked

好的,这是一个有点奇怪的要求,没有指定Oracle版本-如果我假设您使用的是受支持的版本,那么在11gr2中引入了关键字
SKIP LOCKED
。您有上面提到的功能,那么您是否使用Oracle 11gr1或更高版本


如果在11gr2或更高版本上,您必须将其与SELECT。。。对于更新跳过锁定-您选择的任何内容都不会被锁定,并且您可以选择的任何不存在于该集中的内容都会根据定义被锁定,尽管这是一个相当大的移动目标,但它的可靠性/一致性将很差且不可重复。

Nope,没有这样的内容。V$Lock保存锁定信息,但是有这样的要求似乎很奇怪,也不太可能是个好主意——你能解释一下为什么需要这样做吗?@Andrew,我想用乐观锁定对表进行批量更新,但不要等待锁定的行,只是跳过它们。另外,在一次更新过程中收集跳过的行也很好,即不运行查询来查找未更新的行。