![](/img/trans.png)
[英]Transaction rollback in innodb mysql/php with mysql_query not working
[英]Php mysql transaction rollback doubts
我对mysql交易有一些疑问。 我需要同时在两个不同的表中创建两个记录,并且如果其中一个插入失败,则不能保存另一个。 这是我的代码:
$conn->autocommit(FALSE);
$conn->query("START TRANSACTION");
// Insert values
$conn->query("INSERT INTO cards (id, points, reg_date, last_update) VALUES ('','$points', '$reg_date', '$reg_date')");
$card_id = $conn->insert_id;
$conn->query("INSERT INTO students (id, firstname, lastname, email, telephone, birthdate, address, city, cap, fiscal_code, username, card_id, password, token_password, reg_date, is_active)
VALUES ('','$student->firstname', '$student->lastname', '$student->email', '$student->telephone', '$student->birthdate', '$student->address', '$student->city', '$student->cap', '$student->fiscal_code', '$student->username', '$card_id','$student->password', '$student->token_password', '$student->reg_date', '$student->is_active')");
// Commit transaction
if (!$conn->commit()) {
print("Transaction commit failed\n");
$conn->rollback();
}
$conn->close();
$ conn链接是在包含的文件中创建的,我需要该$ card_id,因为它是第二个查询的值中的外键。 问题是:如果第一个查询失败,则一切正常,因此没有记录插入我的数据库中。 但是,如果第二个查询失败,则回滚将不起作用,并且第一个查询的记录将保存在数据库中。 编辑:我正在使用InnoDB。 我在哪里做错了? 谢谢。
首先确保您的数据库引擎是InnoDB。
function begin(){
mysql_query("BEGIN");
}
function commit(){
mysql_query("COMMIT");
}
function rollback(){
mysql_query("ROLLBACK");
}
mysql_connect("localhost","root", "") or die(mysql_error());
mysql_select_db("test") or die(mysql_error());
begin(); // transaction begins
// Insert values
mysql_query("INSERT INTO cards (id, points, reg_date, last_update) VALUES ('','$points', '$reg_date', '$reg_date')");
$card_id = $conn->insert_id;
mysql_query("INSERT INTO students (id, firstname, lastname, email, telephone, birthdate, address, city, cap, fiscal_code, username, card_id, password, token_password, reg_date, is_active)
VALUES ('','$student->firstname', '$student->lastname', '$student->email', '$student->telephone', '$student->birthdate', '$student->address', '$student->city', '$student->cap', '$student->fiscal_code', '$student->username', '$card_id','$student->password', '$student->token_password', '$student->reg_date', '$student->is_active')");
$result = mysql_query($query);
if(!$result){
rollback(); // transaction rolls back
echo "transaction rolled back";
exit;
}else{
commit(); // transaction is committed
echo "Database transaction was successful";
}
?>
希望这可以帮助。
好的,我找到了解决方案,这是工作代码:
$conn->autocommit(FALSE);
$conn->query("START TRANSACTION");
// Insert values
$res=$conn->query("INSERT INTO cards (id, points, reg_date, last_update) VALUES ('','$points', '$reg_date', '$reg_date')");
$card_id = $conn->insert_id;
$res1= $conn->query("INSERT INTO students (id, firstname, lastname, email, telephone, birthdate, address, city, cap, fiscal_code, username, card_id, password, token_password, reg_date, is_active)
VALUES ('','$student->firstname', '$student->lastname', '$student->email', '$student->telephone', '$student->birthdate', '$student->address', '$student->city', '$student->cap', '$student->fiscal_code', '$student->username', '$card_id','$student->password', '$student->token_password', '$student->reg_date', '$student->is_active')");
// Commit transaction
if ($res and $res1) {
$conn->commit();;
} else {
$conn->rollback();
}
$conn->close();
谢谢大家!
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.