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语句。我在这里做错了什么或理解错了什么,以及如何正确地做到这一点