默认情况下,是否所有knex查询都在事务中运行?

时间:2018-08-02 15:06:58

标签: mysql transactions deadlock knex.js

我没有使用knex.transactionknex.forUpdateknex.forShareknex.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);
}

1 个答案:

答案 0 :(得分:0)

在运行Runnin迁移时,Knex默认情况下会创建隐式事务。否则,knex不会创建任何隐式锁。

问题中的信息太少,无法回答对此更有用的信息。