【问题标题】:PHP - accessing locked row in an Oracle tablePHP - 访问 Oracle 表中的锁定行
【发布时间】:2013-02-12 16:00:44
【问题描述】:

我有一个需要向 PHP 页面 (backend.php) 发送多个 Ajax 请求的 Web 应用程序

有一个 Oracle 表,假设 T1 有 2 个 int 字段 minmax(为此例子就够了,其实有点复杂)。

Backend.php 需要读取 mixmax,更新这些值(比如说 min += 2, max += 3),然后通过返回 min 和 max一些 JSON。

在这种情况下,我不能使用 Oracle 序列(因为在实际应用程序中有 N 行)。

我想在行上加一个,以避免不同的 Ajax 调用从行中读取相同的值。

我尝试(通过 PHP 的 OCI)运行 SELECT a, b FROM t1 FOR UPDATE SKIP LOCKED 之类的东西,但它似乎不起作用,2 个 Ajax 调用有时会返回相同的 A 和 B 值。

我怎样才能使锁工作?有没有更好的办法?谢谢。

【问题讨论】:

  • 省略SKIP LOCKED子句是否有效?
  • 不,它没有。无论如何,在一行上加锁是正确的方法吗?
  • 在您想要锁定数据库中的行期间,您正在做什么来确保特定的 PHP 会话映射到恰好一个数据库会话?这通常不是构建三层应用程序的方式。根据您对问题的描述,持有锁的会话似乎过早释放回连接池。
  • 我无法发现明显的错误。我自己使用了FOR UPDATE(没有SKIP LOCKED),它工作正常:并发查询排队,直到表被释放。当然,您需要确保在完成之前不释放。
  • 锁应该在 PHP 脚本结束时释放,或者在提交之后,不是吗?我会在没有 FOR UPDATE 的情况下再试一次。谢谢。

标签: php ajax oracle concurrency locking


【解决方案1】:

我不确定您是否需要显式锁定。一个简单的

update T1 set min=min+2, max=max+3 where ...

将自动锁定受影响的行。

您可能需要另一个选择来返回更新后的值(或在 PL/SQL 中使用 RETURNING)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-02-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-12-16
    • 1970-01-01
    • 2013-07-14
    相关资源
    最近更新 更多