Oracle虚拟列或函数以发现特定行上的锁

时间:2018-07-23 11:51:54

标签: sql oracle locking rows

Oracle是否提供诸如虚拟列之类的功能来查看行的锁定状态?

换句话说,我正在寻找一个LOCKED_STATUS之类的属性来区分表的锁定行和未锁定行,就像我们可以运行以下查询一样。

不要与for 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

1 个答案:

答案 0 :(得分:1)

好吧,这有点奇怪,没有指定Oracle版本-如果我假设您使用的是受支持的版本,则在11gr2中引入了关键字function ApiCallFunction(Datatext, ApiName, FunctionName) { $.ajax({ url: Apiurl + ApiName, type: "POST", data: Datatext, contentType: "application/json", dataType: "json", success: function (data) { window[FunctionName].apply(this,data); }, error: function (error) { jsonValue = jQuery.parseJSON(error.responseText); ErrorWhileSave(jsonValue.Message); }, failure: function (response) { ErrorWhileSave(""); } }); } 。您上面有,所以您使用的是Oracle 11gr1或更早的版本?

如果在11gr2或更高版本上,则必须将其与SELECT ... FOR UPDATE SKIP LOCKED结合使用-虽然您选择的任何内容均未锁定,但您可以选择的任何内容均未定义锁定,尽管那是一个相当大的移动目标被击中-它的可靠性/一致性将很差且不可重复。