PDO:トランザクションはロールバックしませんか?
-
19-09-2019 - |
質問
私はを通じてPDOについては、このチュートリアルに行くと持っていますトランザクションに関するポイントに来ます。接続部をスキップ、私はこのPHPコードを持っています:
try
{
$db->beginTransaction();
$db->exec('DROP TABLE IF EXISTS animals');
$db->exec('CREATE TABLE animals ('
.'animal_id MEDIUMINT(8) NOT NULL AUTO_INCREMENT PRIMARY KEY,'
.'animal_type VARCHAR(25) NOT NULL,'
.'animal_name VARCHAR(25) NOT NULL)'
.'ENGINE=INNODB');
$db->exec('INSERT INTO animals (animal_type, animal_name) VALUES ("emu", "bruce")');
$db->exec('INSERT INTO animals (animal_type, animal_name) VALUES ("funnel web", "bruce")');
$db->exec('INSERT INTO animals (animal_type, animal_name) VALUES ("lizard", "bruce")');
$db->exec('INSERT INTO animals (animal_type, animal_name) VALUES ("dingo", "bruce")');
$db->exec('INSERT INTO animals (animal_type, animal_name) VALUES ("kangaroo", "bruce")');
$db->exec('INSERT INTO animals (animal_type, animal_name) VALUES ("wallaby", "bruce")');
$db->exec('INSERT INTO animals (animal_type, animal_name) VALUES ("wombat", "bruce")');
$db->exec('INSERT INTO animals (animal_type, animal_name) VALUES ("koala", "bruce")');
$db->exec('INSERT INTO animals (animal_type, animal_name) VALUES ("kiwi", "bruce")');
$db->commit();
echo 'Table re-created and data entered successfully.';
}
catch(PDOException $e)
{
$db->rollback();
echo $e->getMessage();
}
これは素晴らしい実行され、のような私は、私がどこかにエラーに入れた場合を除き、それは思いました。私は第四INSERT文で間違いを作成した場合と同じように、私は、データベース内の3匹の動物を見つけるだろう。しかし、私は物事が、私はこのスクリプトを実行する前にそれがあったように私がデータベースを見つけるだろうことを意味し、ロールバックされることになったと思いました。
私は何かを誤解したことがありますか?私は何をしないのですか?トランザクションおよびロールバック機能は、私は、彼らがやるべきことだと思うものよりも他の何かをするのでしょうか?ドロップすると、何らかの形で取引を「壊す」の文を作成していますか?ここで何が起こっているのですか?
<時間>の のアップデート:のののトランザクションは、テーブルが作成された後にのみ開始して、私は$db->beginTransaction();
ラインを移動すると、私は期待していた動作を得ます。第三insert文が失敗したのであれば、私は、トランザクションがロールバックされた後に(それは単に再作成されたため)空のテーブルを持っているでしょう。しかしトランザクションでドロップとは、ステートメントを作成するとき、それは働いていない理由は、まだ迷っています... の
解決
PHPのリファレンスマニュアルを参照してください: PDO ::のbeginTransactionする
のMySQLを含むいくつかのデータベースを、自動的にデータベース定義言語(DDL)文のようにDROP TABLEのようまたはCREATE TABLEはトランザクション内で発行されたときに暗黙的にCOMMITを発行。暗黙的なトランザクション境界で他のあらゆる変更をロールバックすることができなくなるでしょうCOMMITます。
この問題が発生した理由を説明し、そしてそれは、MySQLのではなく、PDO / PHPの制限です。
他のヒント
すべてのテーブルがトランザクションをサポートしていることを確認してください。 たとえばMyISAMテーブルではないサポートを行います。