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

Mysql 默认情况下,是否在事务中运行所有knex查询?,mysql,transactions,deadlock,knex.js,Mysql,Transactions,Deadlock,Knex.js,我没有使用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'

我没有使用
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);
}

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


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

我不是说运行迁移。看起来knex确实创建了隐式锁,因为我遇到了一些死锁错误。我就是找不到地方。例如,当更新的问题中描述的查询以非常快的速度执行两次时,我会得到错误。可能是子查询施加锁的行为?Knex不创建隐式锁。数据库可能会创建它们(knex只将查询发送到要执行的数据库,knex不发送任何额外的锁定查询)。无论如何,knex确实使用多个连接来发送查询,所以除非在发送下一个查询之前等待前面查询的结果,否则您无法确定执行顺序。