【发布时间】:2013-02-12 16:00:44
【问题描述】:
我有一个需要向 PHP 页面 (backend.php) 发送多个 Ajax 请求的 Web 应用程序
有一个 Oracle 表,假设 T1 有 2 个 int 字段 min 和 max(为此例子就够了,其实有点复杂)。
Backend.php 需要读取 mix 和 max,更新这些值(比如说 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