我在mysqli下有一个列为$db
的数据库。这个数据库包含在两个表中,我在下面列为table
和table2
(仅适用于此示例)。 Table2的行需要表中的id。这很好,但是将列添加到table2中可能会出现问题,因此需要回滚例程。但是,它似乎没有起作用。
我开始关闭自动提交。然后我尝试输入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);
我有什么遗失的吗?我试着尽可能地遵循我为自动提交找到的例子。
答案 0 :(得分:1)
事务仅在表引擎支持它们时起作用,例如InnoDB的。