0

我今天遇到了一个非常奇怪的 Oracle 问题。

我用 xampp 设置了一个新服务器进行开发,我激活了 mssql 和 oracle,一切都很好,直到我尝试执行更新语句。

在 PHP 5.3 中,每个选择、插入等都可以正常工作。

我也可以解析该语句并返回一个资源 ID,但是当我尝试执行该语句时,我的整个站点都没有响应。

没有错误,什么都没有。只是超时,直到我重新启动apache。

这里的代码......这是测试代码,所以应该没有问题。

$conn = oci_connect('***', '***', '***');

$query ="UPDATE CHAR*** SET TPOS = 14, ID = 5, DIFF = 'J' WHERE ***NR = '3092308' AND LA*** = '5'";
echo $query;
echo '<br>';
echo $stid = oci_parse($conn, $query);
oci_execute($stid, OCI_DEFAULT);    
oci_free_statement($stid2);

任何提示或想法?:-( 我已经尝试重新安装 oracle 即时客户端和另一个版本。我现在正在使用 10g,就像我们的数据库一样。

最好的问候垫

4

1 回答 1

3

该行可能被另一个会话锁定。如果是这种情况,您的会话将挂起,直到其他事务结束(提交/回滚)。

您应该SELECT FOR UPDATE NOWAIT在尝试更新一行(悲观锁定)之前执行以下操作:

  • 如果该行被锁定,您将收到错误消息,并且可以向用户返回一条消息,说明该记录当前正在由另一个会话更新。在大多数情况下,明确的消息比无限期的等待更可取。

  • 如果该行可用,您将确保在您提交之前没有会话修改其内容(因此您将防止任何形式的丢失更新)。

还有其他原因导致简单更新可能需要很长时间,但可能性较小,例如:

  • 当你更新一个未索引的外键时,Oracle 需要在整个父表上获得一个短时间的锁。在繁忙和/或大桌子上,这可能需要很长时间。
  • 表上可能有执行额外工作的触发器。

进一步阅读:悲观与乐观锁定

于 2013-06-13T08:11:23.437 回答