Oracle - SELECT-INSERT锁定模式

时间:2013-09-17 16:23:00

标签: oracle concurrency plsql

我有一个表Orders(列orderIdorderTypeuserIdstate,...)。我需要我的流程来执行以下操作:

  1. 检查是否存在具有特定类型的订单,具有特定用户的特定状态(SELECT)。
  2. 如果这样的订单不存在 - 创建一个(INSERT)。
  3. 所以基本上我想确保总是只有一个订单:

    • orderType = x
    • userId = y
    • state = z

    但我无法创建约束,因为x1,y1,z1可能存在多个订单。

    我必须说我在Oracle中没有经验。我已经在Oracle上的锁上读了this article,并且它确定了唯一有用的锁定类型是:

    LOCK TABLE Orders IN EXCLUSIVE MODE
    

    但我认为仅针对某些数据子集锁定整个表格是过度的。我使用SELECT ... FOR UPDATE OF <update_column>的不同列尝试了<update_column>,但是他们允许我插入新行。

    这种类型的并发是否有任何模式?它为Oracle为SELECT-UPDATE模式创建SELECT ... FOR UPDATE OF ...的接缝。 SELECT-INSERT有什么类似的东西吗?

1 个答案:

答案 0 :(得分:6)

您可以创建基于函数的唯一索引来强制执行此类约束。如果您要强制执行state“完成”的唯一行,但允许许多行{“1”}为“草稿”。

state