Yii2迁移事务方法,safeup()和safedown()不起作用

时间:2016-03-07 10:17:44

标签: php mysql yii

我在yii中使用了safeUp和safeDown方法进行数据库事务,但似乎没有工作。以下是我的代码:

    public function safeUp()
{
    $this->createTable(self::TABLE_EMPLOYMENT_HISTORY, [
        'id' => $this->integer() . ' UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY',
        'user_id' => $this->integer()->unsigned()->notNull(),
        'start_date' => $this->dateTime()->notNull(),
        'end_date' => $this->dateTime(),
        'role' => $this->string(150)->notNull(),
        'position' => $this->string(50)->notNull(),
        'achievements' => $this->text(),
        'created_at' => $this->dateTime()->notNull(),
        'updated_at' => $this->dateTime()->notNull(),
        'status' => $this->string(50)->notNull()
    ]);
    $this->addForeignKey('fk_' . self::TABLE_EMPLOYMENT_HISTORY . '_' . self::TABLE_USERS . '_id', self::TABLE_EMPLOYMENT_HISTORY, 'user_id', self::TABLE_USERS, 'id');
    $this->addForeignKey('fk_' . self::TABLE_EMPLOYMENT_HISTORY . '_' . self::TABLE_STATUSES . '_key', self::TABLE_MISTAKE, 'status', self::TABLE_STATUSES, 'key');
}

public function safeDown()
{
    $this->dropForeignKey('fk_' . self::TABLE_EMPLOYMENT_HISTORY . '_' . self::TABLE_STATUSES . '_key', self::TABLE_EMPLOYMENT_HISTORY);
    $this->dropForeignKey('fk_' . self::TABLE_EMPLOYMENT_HISTORY . '_' . self::TABLE_USERS . '_id', self::TABLE_EMPLOYMENT_HISTORY);
    $this->dropTable(self::TABLE_EMPLOYMENT_HISTORY);

}

当我运行它时,它当然说当尝试创建外键时表TABLE_MISTAKE不存在。我期待回滚,但事情没有发生,相反,它继续创建表' EMPLOYMENT_HISTORY'。

尽管使用了safeup方法,为什么要创建表?

我们将不胜感激。

1 个答案:

答案 0 :(得分:3)

来自MySQL docs

  

某些语句无法回滚。通常,这些包括数据   定义语言(DDL)语句,例如那些创建或   drop database,创建,删除或更改表或存储的数据库   例程。

     

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

这是正常行为。例如PostgreSQL没有这个问题。