我有以下代码:
...
$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,但回滚不起作用。即使我故意错误地编写了一些截断命令,它仍然会运行rest命令,给我错误,但它不会回滚。
任何人都知道如何正确使用mysqli上的事务
发布于 2012-08-31 23:22:49
来自TRUNCATE TABLE的MySQL Reference Manual (重点是我的):
从逻辑上讲,TRUNCATE TABLE类似于删除所有行的DELETE语句,或一系列DROP TABLE和CREATE TABLE语句。为了实现高性能,它绕过了删除数据的DML方法。因此,它不能回滚,它不会触发ON DELETE触发器,并且不能对具有父子外键关系的InnoDB表执行此操作。
如果您希望能够使用ROLLBACK,那么您将不得不使用DELETE语句。它们在这里效率较低,但应该可以提供所需的行为。
发布于 2012-08-31 23:27:52
在我看来,这些TRUNCATE命令会导致隐式提交:
http://dev.mysql.com/doc/refman/5.0/en/implicit-commit.html
https://stackoverflow.com/questions/12218192
复制相似问题