Php 第2条原则迁移-POSTOP中的交易

Php 第2条原则迁移-POSTOP中的交易,php,doctrine,symfony-3.4,Php,Doctrine,Symfony 3.4,在up()方法中完成结构数据库更改后,我想使用postp()导入一些数据。导入应该在使用DBALAPI的事务中完成。然而,插入似乎是一个接一个地提交的。如果在导入的中间出现错误,例如“复制键”错误,则可以观察到这一点。即使启动了回滚,在错误发生之前执行的插入也将提交到数据库。似乎破坏事务行为的是up()方法中的任何DDL语句 考虑以下几点: public function up(Schema $schema) : void { // this up() migration is auto

up()
方法中完成结构数据库更改后,我想使用
postp()
导入一些数据。导入应该在使用DBALAPI的事务中完成。然而,插入似乎是一个接一个地提交的。如果在导入的中间出现错误,例如“复制键”错误,则可以观察到这一点。即使启动了回滚,在错误发生之前执行的插入也将提交到数据库。似乎破坏事务行为的是
up()
方法中的任何DDL语句

考虑以下几点:

public function up(Schema $schema) : void
{
    // this up() migration is auto-generated, please modify it to your needs
    $this->abortIf($this->connection->getDatabasePlatform()->getName() !== 'mysql', 'Migration can only be executed safely on \'mysql\'.');

    $this->addSql('CREATE TABLE user (id INT NOT NULL, name VARCHAR(255) NOT NULL, PRIMARY KEY(id)) DEFAULT CHARACTER SET UTF8 COLLATE UTF8_unicode_ci ENGINE = InnoDB');

}

public function postUp(Schema $schema)
{

        /**
         * @var EntityManager $em
         */
        $em = $this->container->get('doctrine.orm.entity_manager');

        $em->getConnection()->transactional(function ($conn) {

             $conn->executeUpdate("INSERT INTO user (id,name) VALUES(1,'Josh')");
             $conn->executeUpdate("INSERT INTO user (id,name) VALUES(1,'Will')");
        });
}
现在,第二条insert语句将导致“1062:Duplicate key”错误,并将触发对连接实例上的
rollback()
的调用。但是,实际回滚不会发生,并且插入的第一行将保留在数据库中。实际上,我使用调试器跟踪了执行过程,但从未调用过
commit()
rollback()
,这是应该调用的,但最终的结果似乎正好相反。我还尝试了在不将插入内容包装到
transactional()
中的情况下执行插入,其行为是相同的

但是,如果
up()
方法中没有DDL语句(例如,如果用户表已经存在),则事务按预期工作,并且
user
表保持为空,无论是否在事务中包装insert语句。我在这里做错了什么或理解错了什么,以及如何正确地做到这一点