1

我遇到了一些使用oci_execute()带有OCI_DEFAULT标志的 Oracle 遗留代码。

oci_execute($this->result, OCI_DEFAULT);

但是,此服务器现在运行 PHP > 5.3.2。根据PHP文档OCI_DEFAULT

自 PHP 5.3.2 (PECL OCI8 1.4) 起已过时,但仍可用于向后兼容。在新代码中使用等效的 OCI_NO_AUTO_COMMIT。

所以我的问题是两部分:

  • OCI_DEFAULTPHP < 5.3.2 代表什么?
  • OCI_DEFAULT在 PHP >= 5.3.2 中使用时的有效模式是什么?(即上面的代码)

在尝试回答第 2 部分时,我希望找到oci_execute_mode()进行调试。但是,AFAIK 不存在此类功能。从运行脚本开始,它似乎在成功的 PHP 脚本结束时提交(即当连接关闭时)。

4

2 回答 2

4

对于 PHP < 5.3.2,OCI_DEFAULT 代表什么?

文档回答了您的第一个问题。

自 PHP 5.3.2 (PECL OCI8 1.4) 起已过时,但仍可用于向后兼容。在新代码中使用等效的 OCI_NO_AUTO_COMMIT。

然后,如果您寻找OCI_NO_AUTO_COMMIT ...

不要自动提交更改。在 PHP 5.3.2 (PECL OCI8 1.4) 之前,使用 OCI_DEFAULT,它是 OCI_NO_AUTO_COMMIT 的别名。

简短回答:“OCI_DEFAULT < PHP 5.3.2” = “与 OCI_NO_AUTO_COMMIT >= PHP 5.3.2 相同” = “不要自动提交当前正在执行的语句。”

在 PHP >= 5.3.2 中使用 OCI_DEFAULT 时的有效模式是什么?(即上面的代码)

它与 < 5.3.2 中所做的相同以保持向后兼容性 - 它现在已过时/不推荐使用。您可以使用 OCI_DEFAULT 或 OCI_NO_AUTO_COMMIT,但您应该使用后者,因为它可能不会永远存在。

于 2013-01-11T16:25:30.987 回答
0

Web 服务器应自动提交,无需手动或自动等待 COMMIT 命令。如果您想处理具有相互依赖的 SQL 查询组的任何事务,我认为最好在业务层或存储过程中处理这些 SQL 查询,如果需要,可以在其中应用 COMMIT 或 ROLLBACK。

编辑:

对于 PHP < 5.3.2,OCI_DEFAULT 代表什么?

当您关闭连接时,OCI_DEFAULT 会自动回滚。您需要显式调用 oci_commit() 来提交事务。

在 PHP >= 5.3.2 中使用 OCI_DEFAULT 时的有效模式是什么?

以前的版本只有 OCI_COMMIT_ON_SUCCESS 和 OCI_DEFAULT。在新版本中,OCI_DEFAULT 只是 OCI_NO_AUTO_COMMIT 的别名。以前,OCI_DEFAULT 会混淆其用途。OCI8 1.4 通过重命名 OCI_DEFAULT 添加了新模式 OCI_NO_AUTO_COMMIT。OCI_DEFAULT 和 OCI_NO_AUTO_COMMIT 之间没有内部性能差异。

于 2013-01-11T15:48:12.363 回答