Php MySqli没有适当地回滚

Php MySqli没有适当地回滚,php,mysqli,Php,Mysqli,我在mysqli下有一个数据库被列为$db。这个数据库包含两个表,我在下面将它们列为table和table2(仅用于本例)。表2的行需要表中的id。这很好,但是将列添加到表2中可能会出现问题,因此需要回滚例程。然而,它似乎不起作用 我从关闭自动提交开始。然后,我尝试输入rollback命令,即使我正在使用die命令来表示失败。据我所知,该事务可能会在运行过程中被遗忘,数据库应该仍然稳定。所以我不确定这里发生了什么,除非数据库完全忽略了我正试图关闭自动提交的事实 我的代码的基本结构如下所示: fu

我在mysqli下有一个数据库被列为
$db
。这个数据库包含两个表,我在下面将它们列为
table
table2
(仅用于本例)。表2的行需要表中的id。这很好,但是将列添加到表2中可能会出现问题,因此需要回滚例程。然而,它似乎不起作用

我从关闭自动提交开始。然后,我尝试输入rollback命令,即使我正在使用
die
命令来表示失败。据我所知,该事务可能会在运行过程中被遗忘,数据库应该仍然稳定。所以我不确定这里发生了什么,除非数据库完全忽略了我正试图关闭自动提交的事实

我的代码的基本结构如下所示:

function problem($str)
{
    global $db;
    mysqli_rollback($db);
    die($str);
}

mysqli_autocommit($db,false);

//Basic check if exists
$sqlstr = "SELECT * FROM table WHERE name = '$name';";
$r = mysqli_query($db,$sqlstr);
if (mysqli_num_rows($r)>0){problem("A row already exists under that id");}

//Insert the row
$sqlstr = "INSERT INTO table (name,v1,v2,v3) VALUES ('$name','$v1','$v2','$v3');";
$r = mysqli_query($db,$sqlstr);
if (!$r){problem("Could not insert into the table. $sqlstr");}

//Get the generated id part 1
$sqlstr = "SELECT id FROM table WHERE name = '$name';";
$r = mysqli_query($db,$sqlstr);
if (!$r){problem("Could not add into the table. $sqlstr");}

//Get the generated id part 2
$row = mysqli_fetch_assoc($r);
$eid = $row['id'];

//A simple loop
$count = count($questions);
for ($i=1;i<=$count;$i++)
{
    //This is where it typically could die.
    $r = mysqli_query($db,"INSERT INTO table2 VALUES (...);");
    if (!$r){problem("Could not add to the table2. $sqlstr");}
}

mysqli_commit($db);
函数问题($str)
{
全球$db;
mysqli_回滚($db);
死亡($str);
}
mysqli_自动提交($db,false);
//基本检查是否存在
$sqlstr=“从表中选择*,其中name='$name';”;
$r=mysqli_查询($db,$sqlstr);
如果(mysqli_num_rows($r)>0){problem(“该id下已经存在一行”);}
//插入行
$sqlstr=“插入到表(名称、v1、v2、v3)中的值(“$name”、“$v1”、“$v2”、“$v3”);”;
$r=mysqli_查询($db,$sqlstr);
if(!$r){problem(“无法插入到表中。$sqlstr”);}
//获取第1部分生成的id
$sqlstr=“从表中选择id,其中name='$name';”;
$r=mysqli_查询($db,$sqlstr);
if(!$r){problem(“无法添加到表中。$sqlstr”);}
//获取第2部分生成的id
$row=mysqli\u fetch\u assoc($r);
$eid=$row['id'];
//简单的循环
$count=count($problems);

对于($i=1;i事务,只有在表引擎支持的情况下才能工作,例如InnoDB。

更改了InnoDB引擎,代码现在工作得很好。谢谢。