Php mysqli相当于mysql_查询(“BEGIN”)

Php mysqli相当于mysql_查询(“BEGIN”),php,mysqli,Php,Mysqli,我正在将我们的代码库从PHP5.4升级到PHP7。在我们的测试中,我们使用命令将整个测试包装在一个事务中 mysql_查询(“开始”) 然后做一些事情 mysql_查询(“回滚”) 然后,这两个命令之间的所有内容都被视为一个事务,可以在测试结束时回滚。我还不能用mysqli在PHP7中实现这个功能。我尝试使用mysqli_autocommit函数,但这不允许测试中的不同查询访问测试早期创建的数据。就好像每个插入都在自己的事务中一样 更新: 问题是,每次我为一个表创建一个新适配器时,我似乎都在创建

我正在将我们的代码库从PHP5.4升级到PHP7。在我们的测试中,我们使用命令将整个测试包装在一个事务中

mysql_查询(“开始”)

然后做一些事情

mysql_查询(“回滚”)

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

更新:

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

$mysqli->begin_transaction();
然后,只有单个连接是事务的一部分。为了实现我想要的功能,我必须隐式地强制每个适配器使用现有的连接,而不是创建自己的连接。我想可能有一种方法,PHP7可以自动为您实现这一点?从现在起,我唯一能想到的方法就是设置一个全局连接,如果它存在,则使用该连接,而不是创建一个新的连接。因此,我的问题仍然存在,是否有一种方法可以强制所有打开的连接都包含在可以回滚的事务中,这里的另一个问题是,重新使用连接的最佳做法是什么,因为我确信设置全局连接是错误的做法

我使用的是MySQL 5.5.52。PHP7.0.10是您想要的。它是这样使用的:

$mysqli->begin_transaction();
这就是你要找的。它是这样使用的:

$mysqli->begin_transaction();
我想可能有一种方法,PHP7可以自动为您实现这一点

没有

我唯一能想到的办法就是建立一个全球

不完全是

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

我想可能有一种方法,PHP7可以自动为您实现这一点

没有

我唯一能想到的办法就是建立一个全球

不完全是


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

请参阅@RocketHazmat我尝试过,但所有插入和更新都注册为提交,并且在测试完成后完全可以访问。什么是数据库引擎?什么版本的
mysql RDBMS
,您使用的是什么版本的
PHP mysqli
?我使用的是MySQL 5.5.52。PHP 7.0.10See@RocketHazmat我试过了,但是所有的插入和更新都注册为提交,并且在测试完成后完全可以访问。什么是数据库引擎?您使用的是哪个版本的
mysql RDBMS
,以及
PHP mysqli
的哪个版本?我使用的是mysql 5.5.52。PHP7.0.10那么,为每个数据库查询打开一个新连接,然后为特定会话打开一个新连接,这被认为是一种不好的做法吗?是的,没错。我甚至会说这是一种不可接受的做法——从性能和可用性两个方面考虑,为特定会话的每个db查询打开一个新连接是否被认为是一种不好的做法?是的,没错。我甚至会说这只是一种不可接受的实践——无论是出于性能还是可用性的原因