我正在开发一个基于 PHP 的 Web 应用程序,其中使用 MySQLi 驱动程序。我相当标准地使用此资源 - 我有一个准备好的语句列表,我在应用程序中的各个点调用这些语句,检查结果,如果成功则提交(或者如果不成功则回滚)。
我最近了解到(通过此处的另一篇文章)“回滚”DDL 查询是不可能的。这些在执行时自动提交任何待处理的事务。对于我的应用程序部分来说,这是一个问题,在该部分中,我基本上创建了数据库的整个结构(在设置过程中) - 我有一个
TABLE
列表,我快速连续地一个接一个地CREATE
(使用 ) mysqli::query
而不是准备好的语句,因为我无法将表的名称作为参数传递)。
因此,我的问题是:是否可以运行一堆 DDL 查询(
CREATE TABLE
、CREATE PROCEDURE
等)而不提交它们?换句话说,是否可以在不实际更改实时数据库的情况下检查这些查询的结果(也许在虚拟数据库上?)?理想情况下,我希望能够在实际更改数据库之前检查 DDL 查询执行期间是否发生错误。
如果在设置过程中,我发现我的一个 DDL 查询有错误,我将遇到一个严重的问题 - 我将无法回滚并更正它,并且我的数据库将设置一半 -向上(仅包含一半所需的表格/过程)。
如果有人知道这样做的方法(在
MySQLi
对象内或其他地方),我将非常感激。我不知道关于执行 DDL 查询是否有任何公认的做法,但对我来说奇怪的是,在实际提交这些更改之前没有办法检查数据库的状态。
非常感谢!
这是做不到的。这不是 PHP 驱动程序或任何语言的问题。
这是数据库本身的一个特性。 DDL 是自提交指令。
InnoDB 中的 CREATE TABLE 语句被作为单个事务处理。这意味着用户的 ROLLBACK 不会撤消用户在该事务期间所做的 CREATE TABLE 语句。
MySQL 文档中有更多相关信息:15.3.3 导致隐式提交的语句
这里有一些关于
mssqli
、transctions
和 DDL statments
的示例: 如何在 mysqli 中启动和结束事务?
霍尔普我帮忙了