【发布时间】:2019-01-31 08:29:49
【问题描述】:
我在我的项目中遇到了实现交易的需要——这是我以前从未做过的事情。我已经检查了我的 aytocommit 是否设置为 1 - 我不确定是否需要触摸它?
现在我有一组脚本,它们都包含首先连接到数据库的函数。有一个完美的地方可以放置mysqli_begin_transaction($link); 和mysqli_autocommit($link, FALSE);,因此无论特定脚本是否需要它,我都会在任何地方进行事务处理,并关闭自动提交 - 如果那里很差,则 php.net 上的文档但是AFAIR 我应该这样做。所以我的问题不是。 1 & 2 将是:无论脚本是否需要它,在任何地方开始事务都可以吗?我也应该像这样禁用自动提交吗?
现在假设我有这样的脚本(很抱歉没有提供实际代码,但我的问题是关于事务如何工作,而不是关于代码本身):
~insert and/or update things
~do something aka "line 2"
~insert and/or update things again
似乎是从书中直接摘取的例子。我显然希望所有插入和更新,或者没有发生。由于我已经开始交易,我假设除非我打电话给mysqli_commit ($link);,否则什么都不会提交。但是在这里我们有一个小问题:我没有在我的脚本末尾包含任何“页脚”,现在这样做似乎是一场噩梦,所以我没有任何地方可以提交。所以问号。 3 是:我的查询是否会在脚本结束后自动提交(或者我调用exit; 或die();)即使我将自动提交设置为false?还是我需要调用提交/不要关闭自动提交?
现在是时候处理一些失败并且我需要回滚的情况了。同上-我需要调用mysqli_rollback (mysqli $link);,还是我没有调用commit 的纯粹事实就足够了?我在这里指的是脚本没有正常结束的情况。诸如在“第 2 行”上工作时关闭服务器电源或因为花费太多时间而停止(set_time_limit 停止它)的情况。
【问题讨论】:
标签: mysql transactions