默认情况下,所有 knex 查询 运行 都在一个事务中吗?
Are all knex queries run in a transaction by default?
我没有使用 knex.transaction
、knex.forUpdate
、knex.forShare
、knex.batchInsert
或任何显式创建事务的方法,但我遇到了 DEADLOCK 错误在我的代码中。如果knex.js默认不创建事务,为什么会创建锁?
更新
当这些查询被非常快速地执行两次时,我得到一个 DEADLOCK 异常。
let subquery2 = knex.select('pv2.*').from('projects_versions as pv2').innerJoin('versions_history as vh', 'pv2.version_id', 'vh.version_id').orderBy('vh.id', 'desc');
let subquery = knex.select('x.version_id').from(subquery2.as('x')).whereRaw('x.project_id = pv.project_id').limit(1);
let result = (await knex.raw('DELETE pv FROM projects_versions AS pv WHERE pv.version_id = ? AND NOT version_id = ?', [versionToDiscard, subquery]))[0];
if (!result.affectedRows) {
await knex('projects_versions').update({ version_id: fifthVersion }).where('version_id', versionToDiscard);
}
Knex 在运行迁移时默认创建隐式事务。否则 knex 不会创建任何隐式锁。
问题中的信息太少,无法回答对此更有用的内容。
我没有使用 knex.transaction
、knex.forUpdate
、knex.forShare
、knex.batchInsert
或任何显式创建事务的方法,但我遇到了 DEADLOCK 错误在我的代码中。如果knex.js默认不创建事务,为什么会创建锁?
更新
当这些查询被非常快速地执行两次时,我得到一个 DEADLOCK 异常。
let subquery2 = knex.select('pv2.*').from('projects_versions as pv2').innerJoin('versions_history as vh', 'pv2.version_id', 'vh.version_id').orderBy('vh.id', 'desc');
let subquery = knex.select('x.version_id').from(subquery2.as('x')).whereRaw('x.project_id = pv.project_id').limit(1);
let result = (await knex.raw('DELETE pv FROM projects_versions AS pv WHERE pv.version_id = ? AND NOT version_id = ?', [versionToDiscard, subquery]))[0];
if (!result.affectedRows) {
await knex('projects_versions').update({ version_id: fifthVersion }).where('version_id', versionToDiscard);
}
Knex 在运行迁移时默认创建隐式事务。否则 knex 不会创建任何隐式锁。
问题中的信息太少,无法回答对此更有用的内容。