代码之家  ›  专栏  ›  技术社区  ›  Maxime Dupré

默认情况下,所有Knex查询都在事务中运行吗?

  •  0
  • Maxime Dupré  · 技术社区  · 6 年前

    我不在用 knex.transaction , knex.forUpdate , knex.forShare , knex.batchInsert 或者任何显式创建事务的方法,但我的代码中有死锁错误。如果knex.js在默认情况下不创建事务,为什么它会创建锁?

    更新

    当这些查询快速执行两次时,我得到一个死锁异常。

    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 回复  |  直到 6 年前
        1
  •  0
  •   Mikael Lepistö    6 年前

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

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