我有以下代码:
...
$mysqli->autocommit(FALSE);
if(in_array('files',$item)){
$sql_el_truncate = "
TRUNCATE TABLE `article_files`;
TRUNCATE TABLE `files`;
TRUNCATE TABLE `gallery_files`;
TRUNCATE TABLE `image_captions`;
";
$mysqli->multi_query($sql_el_truncate);
do{
$mysqli->use_result();
}while ($mysqli->next_result());
if ($mysqli->errno) {
$valid_entry = 0;
}
echo $valid_entry;
}
if( $valid_entry){
$mysqli->commit();
}else{
$mysqli->rollback();
}
...
出错时我得到一个正确的$valid_entry
值为0,但回滚不起作用。即使我故意写了一些TRUNCATE命令,它仍然会运行其余的命令,给我错误但它不会回滚。
任何人都知道如何在mysqli
上正确使用该交易?
答案 0 :(得分:3)
来自MySQL Reference Manual的TRUNCATE TABLE
(重点是我的):
逻辑上,TRUNCATE TABLE类似于DELETE语句 删除所有行,或DROP TABLE和CREATE TABLE的序列 声明。为了实现高性能,它绕过了DML方法 删除数据。因此,无法回滚,它不会导致ON DELETE触发器触发,无法对InnoDB表执行 与父子外键关系。
如果您希望能ROLLBACK
,则必须使用DELETE
语句。它们在这里效率较低,但应该给你理想的行为。
答案 1 :(得分:0)
在我看来,那些TRUNCATE命令会导致隐式提交: