0

我写了这个,但事务不起作用,我还转换了 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

4

1 回答 1

1

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

引用 MySQL 手册:

有些语句不能回滚。通常,这些包括数据定义语言 (DDL) 语句,例如创建或删除数据库的语句,创建、删除或更改表或存储例程的语句。

你应该设计你的交易不包括这样的陈述。如果您在无法回滚的事务中早期发出语句,然后另一个语句稍后失败,则在这种情况下无法通过发出 ROLLBACK 语句来回滚事务的全部效果。

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

于 2013-08-29T08:13:35.883 回答