Все ли запросы knex выполняются в транзакции по умолчанию?

0

Я не использую 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);
}
Теги:
transactions
knex.js
deadlock

1 ответ

0
Лучший ответ

Knex создает неявную транзакцию по умолчанию при выполнении переходов. В противном случае knex не создает никаких неявных блокировок.

В вопросе слишком мало информации, чтобы иметь возможность ответить на что-нибудь более полезное для этого.

  • 0
    Я не говорю о запуске миграции. Кажется, что knex действительно создает неявные блокировки, так как я получаю некоторые ошибки DEADLOCK. Я просто не могу найти где. Например, когда запрос, описанный в моем обновленном вопросе, выполняется дважды очень быстро, я получаю ошибку. Возможно, это поведение подзапросов для наложения блокировок?
  • 0
    Knex не создает скрытых блокировок. База данных может их создавать (knex просто отправляет запросы в базу данных для выполнения, knex не отправляет никаких дополнительных запросов блокировки). В любом случае knex использует несколько соединений для отправки запросов, поэтому вы не можете быть уверены в порядке выполнения, пока не дождетесь результата предыдущего запроса перед отправкой следующего.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню