mysqli相当于mysql_query(" BEGIN")

时间:2016-09-12 21:57:19

标签: php mysqli

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

将整个测试包装在一个事务中

的mysql_query(" BEGIN&#34);

然后做一堆东西

的mysql_query(" ROLLBACK&#34);

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

更新:

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

$mysqli->begin_transaction();

然后只有单个连接才是交易的一部分。为了实现我想要的功能,我必须隐式强制每个适配器使用现有连接,而不是创建自己的连接。我想可能有一种方法PHP7会自动为您执行此操作?从现在开始我唯一可以弄清楚如何做到这一点的方法是设置一个GLOBAL,如果它存在则使用连接而不是创建一个新连接。所以我的问题仍然存在,是否有办法强制所有打开的连接都包含在可以回滚的事务中,这里的另一个问题是关于重新使用连接的最佳做法是什么?确保设置全局是错误的方法。

我正在使用MySQL 5.5.52。 PHP 7.0.10

2 个答案:

答案 0 :(得分:3)

  

我想有可能PHP7会自动为您执行此操作?

没有

  

我能弄清楚如何做的唯一方法是设置一个GLOBAL

不完全。

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

答案 1 :(得分:0)

begin_transaction正是您要找的。它的用法如下:

$mysqli->begin_transaction();