问题描述
在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,'Will')");
});
}
的调用。但是,不会发生实际的回滚,并且第一行插入将保留在数据库中。我实际上是使用调试器跟踪执行的,并且从未调用rollback()
,没有调用commit()
,但是最终结果似乎相反。我也尝试执行插入而不将其包装在rollback()
中,其行为是相同的。
但是,如果transactional()
方法中没有DDL语句(例如,如果用户表已经存在),则事务将按预期工作,并且up()
表将保持为空,无论是否包装事务中的插入语句。我在做什么或在这里理解错误以及如何正确执行此操作?
解决方法
暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!
如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。
小编邮箱:dio#foxmail.com (将#修改为@)