【问题标题】:Disabling mysql autocommit in php does not work在php中禁用mysql自动提交不起作用
【发布时间】:2012-01-02 23:51:37
【问题描述】:

当然我可能做错了什么,但我真的不明白为什么以及如何做。

我想在 php 脚本中禁用自动提交。这是因为我个人的 php mysql 框架就是这样工作的。但不知何故无法关闭自动提交。我将 Mysqli 与 engine=InnoDB 表一起使用,并尝试了 mysqli::autocommit 功能以及用于全局和会话的 mysql 语句。

所有结果都是相同的答案:自动提交仍然打开。没有返回错误说我使用了不正确的语句。查询返回 true,尝试提交,返回 true。

我在这里有什么遗漏吗?自动提交必须在运行时关闭,因为它将运行的主机不允许我在服务器设置中禁用它:)

【问题讨论】:

  • 在某些情况下为我工作 - 你能分享任何代码吗?您如何设置/启动交易?在运行命令之前如何确保自己确实处于事务中?
  • 你试过start transaction;查询吗?
  • 好吧,目前我关闭了自动提交,它说自动提交值为 0。但即便如此,任何插入查询都会以某种方式提交。 @pageid,我所做的就是关闭自动提交,运行插入查询,然后运行一个保存点函数,该函数实际上运行我的 save($commit=false) 函数,该函数将执行插入,但不执行提交。奇怪的是,保存是唯一使用 mysqli_commit 的函数...
  • 好吧,我已经尝试了启动事务,在 navicat 中按预期工作,在 PHP 中没有......它仍然提交,而自动提交关闭并且启动事务正在运行..
  • 必须以某种方式调用回滚,现在我的问题在于何时执行?因为在 php 的 __destruct 函数中,包含连接的变量正在被销毁...

标签: php mysql autocommit


【解决方案1】:

http://dev.mysql.com/doc/refman/5.0/en/server-system-variables.html#sysvar_autocommit

默认情况下,客户端连接以 autocommit 设置为 1 开始。要使客户端以默认值 0 开始,请设置服务器的 init_connect 系统变量:

SET GLOBAL init_connect='SET autocommit=0';

init_connect 变量也可以在命令行或选项文件中设置。要使用选项文件设置变量,如刚才所示,请包含以下行:

[mysqld]
init_connect='SET autocommit=0'

还可以查看下面的link,有一种方法可以返回一个布尔值,指示提交是否成功打开/关闭。

还可以使用@@autocommit 来确定自动提交的当前状态。

【讨论】:

  • 好吧,自动提交已关闭,我意识到我很愚蠢并且没有获取查询结果;)。但是任何插入查询都在提交,而我肯定只是运行插入查询,而不是 mysqli_commit。我也尝试了您的 init_connect 建议,但没有奏效!
【解决方案2】:

谢谢大家,我的问题已经解决了!我以某种方式发现,当您没有明确执行回滚或关闭连接时,插入会被提交。使用 register_shutdown_function 您可以进行回滚或关闭连接。

再次感谢您的帮助!

【讨论】:

  • 不要忘记将您的答案设置为已接受,或者编辑我们的问题并将帮助您走上正确道路的人标记为已接受的答案。
猜你喜欢
  • 1970-01-01
  • 2011-04-14
  • 1970-01-01
  • 1970-01-01
  • 2017-11-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多