我想在我的ts项目中使用knex。 迁移看起来像这样:
export async function up(knex: Knex): Promise<any> {
return knex.schema.createTable('first_table', (t) => {
t.integer('first_table_id').primary();
}).createTable('second_table', (t) => {
t.integer('id');
// simulation sql error, duplicate in this case.
t.integer('id').
})
}
迁移已失败。我等待所有事务的回滚,但是我已经成功创建了first_table。我不明白某事或Knex行为不正确?
答案 0 :(得分:0)
当mysql执行DDL查询时,它会隐式提交。因此,在创建表事务的每个查询之后,都会自动提交。
除了在运行迁移之前进行数据库转储并在迁移失败后进行还原之外,没有其他解决方法。
https://dev.mysql.com/doc/refman/8.0/en/implicit-commit.html
例如,如果执行以下操作,则使用mysql:
* start transaction
* create table 1
* rollback
表1仍将被创建,并且没有任何回滚,因为mysql实际上在内部:
* start transaction
* create table 1
* implicit commit
* implicit start transaction for rollback query
* rollback of automatically started empty transaction