mysql事务不适用于innodb表



我写了这个,但事务不起作用,我还将两个表都转换为innodb类型。任何人都可以指导我在编码或事务的另一种选择中出错。

mysql_query("begin;");
  $query1 = mysql_query("ALTER TABLE products ADD COLUMN {$_POST[fields]} VARCHAR(60)");
  $query2 = mysql_query("INSERT INTO fields (cid5,fields,field_title,field_type)
                      VALUE ('$_POST[cid]','$_POST[fields]','$_POST[field_title]','$_POST[field_type]')");                
if (($query1)&&($query2)) {mysql_query("commit;");}
else {mysql_query("rollback;");}
}

我使用的是mysql 5.1.69-cll

ALTER TABLE是一个DDL(数据定义语言)语句;这在MySQL innodb引擎中不是事务性的。INSERT是一个DML语句(数据操作语言),它是事务性的。因为一个语句不是事务性的,而另一个是事务性的。所以这两个语句不应该组合在一个事务中。

引用MySQL手册:

某些语句无法回滚。一般来说,这些包括数据定义语言(DDL)语句,例如创建或删除数据库,即那些创建、删除或更改表或存储的数据库例程。

您应该将交易设计为不包含此类报表。如果您在事务的早期发布了一个无法滚动的语句返回,然后另一个语句稍后失败在这种情况下,不能通过发出ROLLBACK来回滚事务陈述

http://dev.mysql.com/doc/refman/5.6/en/cannot-roll-back.html

相关内容

最新更新