教义2迁移-PostUp中的交易

时间:2020-10-23 10:48:26

标签: php doctrine symfony-3.4

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

请考虑以下内容:

up()

现在,第二个insert语句将导致“ 1062:重复键”错误,并将触发对连接实例上的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')"); }); } 的调用。但是,不会发生实际的回滚,并且第一行插入将保留在数据库中。我实际上是使用调试器跟踪执行的,并且从未调用rollback(),没有调用commit(),但是最终结果似乎相反。我也尝试执行插入而不将其包装在rollback()中,其行为是相同的。

但是,如果transactional()方法中没有DDL语句(例如,如果用户表已经存在),则事务将按预期工作,并且up()表将保持为空,无论是否包装事务中的插入语句。我在做什么或在这里理解错误以及如何正确执行此操作?

0 个答案:

没有答案