mysqli equivalent to mysql_query("BEGIN")


mysqli equivalent to mysql_query("BEGIN")

我正在将我们的代码库从PHP5.4升级到PHP7。在我们的测试中,我们使用命令

将整个测试封装在事务中。

mysql_query("开始");

然后做一堆事情

mysql_query("回滚");

,那么这两个命令之间的所有内容都被视为事务,并且可以在测试结束时回滚。我还没有能够实现这个功能在PHP7与mysqli。我尝试使用mysqli_autocommit函数,但这并不允许测试中的不同查询访问测试早期创建的数据。就好像每次插入都在自己的事务中。

更新:

问题是,每次我创建一个新的适配器到一个表,似乎我正在创建一个新的连接到数据库。对于PHP5和上面的命令'mysql_query("BEGIN")',每个连接都包含在该事务中,并且所有语句都可以回滚。我还没有找到一种方法来做到这一点与php7。如果我使用

$mysqli->begin_transaction();

则只有该连接是事务的一部分。为了实现我想要的功能,我必须隐式地强制每个适配器使用现有的连接,而不是创建自己的连接。我想可能有一种方式,PHP7自动为您做这些?因为现在我能弄清楚如何做到这一点的唯一方法是设置一个全局,如果它存在使用连接,而不是创建一个新的。所以我的问题仍然存在,是否有一种方法可以强制打开的所有连接包含在可以回滚的事务中,这里的一个进一步的问题是重用连接的最佳实践是什么,因为我确信设置全局是错误的方式。

我正在使用MySQL 5.5.52。PHP 7.0.10

我想可能有一种方式,PHP7自动为您做这些?

我能弄清楚如何做到这一点的唯一方法是设置一个全局

不完全是。

您可以使用OOP,并为所有可能需要它的类提供单个SQL适配器实例。但是,如果您的代码是过程式的,则可以使用全局变量或单例helper类。

begin_transaction就是你要找的。它的用法如下:

$mysqli->begin_transaction();