【问题标题】:mysql transaction not working with innodb tablesmysql事务不适用于innodb表
【发布时间】:2013-08-29 07:41:46
【问题描述】:

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

【问题讨论】:

  • 对每个查询进行回显,检查语法,自然运行,发布错误消息。然后永远记住:永远不要吃生的 $_POST 或 $_GET 变量
  • 请定义“不工作”。
  • 为什么是asp.net 标签?

标签: php mysql asp.net sql


【解决方案1】:

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

引自 MySQL 手册:

有些语句不能回滚。一般来说,这些包括数据 定义语言 (DDL) 语句,例如创建或 删除数据库,创建、删除或更改表或存储的数据库 例行公事。

您应该在设计交易时不包含此类声明。如果 您在无法滚动的事务中尽早发出语句 返回,然后另一个语句稍后失败,完整的效果 在这种情况下,事务不能通过发出 ROLLBACK 来回滚 声明。

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

【讨论】:

    猜你喜欢
    • 2021-09-05
    • 2012-12-26
    • 1970-01-01
    • 2017-02-18
    • 2011-10-18
    • 1970-01-01
    • 1970-01-01
    • 2011-02-13
    • 1970-01-01
    相关资源
    最近更新 更多