【问题标题】:How can I insert a record and lock that row simultaneously?如何插入记录并同时锁定该行?
【发布时间】:2010-07-20 12:43:25
【问题描述】:

我正在使用配置为使用自主事务的 Oracle 存储过程插入一行。我想插入这个记录,提交那个事务,然后锁定新插入的记录,这样除了我当前的会话之外没有其他人可以修改它(显然,在另一个事务中,因为插入它的那个是自治的)。

在我有机会SELECT...FOR UPDATE 之前,如何确保没有其他人锁定这条新记录?

使用 Oracle 10g。

【问题讨论】:

  • 我认为前两个答案提出的真正问题是“为什么需要使用自治事务来插入行?”如前所述,您可以在原始过程中进行插入,然后使用记录进行更新。当真正的事务完成时提交。

标签: sql oracle plsql locking


【解决方案1】:

不,您永远无法在事务之间保持锁定。您应该问自己的问题是为什么需要在insertselect ... for update 之间发出提交。该行被insert 锁定;如果您在提交之前完成了对该行所做的任何事情,那么您不必担心重新锁定该行。

【讨论】:

    【解决方案2】:

    我的首选是删除 COMMIT,直到数据可供其他会话使用。

    或者,您可以设计您的应用程序,以确保新行仅被该事务锁定。

    1. 向表中添加一个标志,例如VISIBLE,默认'N'

    2. 插入行时,插入默认值。

    3. 提交后,selectfor update,并将标志更新为'Y'(这样当您的代码第二次提交时,它也会更新标志。

    4. 修改您的应用程序,以便其他会话将忽略 VISIBLE='N' 所在的行。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-07-01
      • 2019-12-26
      • 2012-05-18
      • 2021-06-25
      • 1970-01-01
      • 1970-01-01
      • 2015-05-03
      • 2011-10-26
      相关资源
      最近更新 更多