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 ステートメント (データ操作言語) です。1 つのステートメントはトランザクションに対応しておらず、もう 1 つはトランザクションに対応していないため、この 2 つをトランザクションで結合することはできません。

MySQLマニュアルからの引用:

一部のステートメントはロールバックできません。一般に、これらには、データベースを作成またはドロップするステートメント、テーブルまたはストアド ルーチンを作成、ドロップ、または変更するステートメントなどのデータ定義言語 (DDL) ステートメントが含まれます。

そのようなステートメントを含めないようにトランザクションを設計する必要があります。ロールバックできないトランザクションの早い段階でステートメントを発行し、後で別のステートメントが失敗した場合、ROLLBACK ステートメントを発行してもトランザクションの完全な効果をロールバックすることはできません。

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

于 2013-08-29T08:13:35.883 に答える