【发布时间】:2019-01-14 10:27:42
【问题描述】:
我想在打字稿中进行事务以刷新表中的一些数据。为此,需要执行以下步骤:
- 截断表中的所有记录
- 将 AUTO_INCREMENT 设置为 1
- 在表中插入新记录
如果出现问题,我想回滚事务并且不更改 db 表中的现有记录。
我尝试了不同的方法,但我认为我遗漏了一些东西,我希望有人能发现我做错了什么。
第一次尝试
await knex.transaction(async (trx) => {
await knex(tableName).truncate().transacting(trx);
await knex.raw(`ALTER TABLE ${tableName} AUTO_INCREMENT=1;`).transacting(trx);
await knex(tableName).insert(data).transacting(trx);
await trx.commit();
});
第二次尝试
await knex.transaction(async (trx) => {
try {
await knex(table).truncate().transacting(trx);
await knex.raw(`ALTER TABLE ${table} AUTO_INCREMENT=1;`).transacting(trx);
await knex(table).insert(data).transacting(trx);
await trx.commit();
} catch (e) {
await trx.rollback();
}
});
第三次尝试
const promisify = (fn: any) => new Promise((resolve, reject) => fn(resolve));
const trx: knex.Transaction = <knex.Transaction> await promisify(this.knex.transaction);
try {
await this.knex(this.table).truncate().transacting(trx);
await this.knex.raw(`ALTER TABLE ${this.table} AUTO_INCREMENT=1;`).transacting(trx);
await this.knex(this.table).insert(data).transacting(trx);
await trx.commit();
return Promise.resolve(data);
} catch (e) {
await trx.rollback();
return Promise.reject(e);
}
任何想法都会非常有用。
【问题讨论】:
-
感谢您撰写本文;我有完全相同的问题。下面的两个答案都有帮助
标签: typescript mariadb knex.js