Ярослав, здравствуйте! Подскажите, пожалуйста, если сталкивались.
В документации написано, чтобы использовать транзакции для всех запросов, нужно установить модуль cls-hooked и настроить namespace, но я не хочу использовать транзакции для всех запросов, а только для необходимых, а чтобы использовать для необходимых надо вторым аргументом передавать имя транзакции так: { transaction: t }, всё хорошо, работает как надо, но я обнаружил в консоли, что даже если не передавать вторым аргументом имя транзакции, запросы находящиеся между const t = await sequelize.transaction(); и await t.commit(); попадают в транзакцию, и в консоли это выглядит так:
START TRANSACTION;
Executing (default): UPDATE "users" SET "balance"=$1 WHERE "id" = $2
Executing (default): SELECT "id", "price" FROM "Books" AS "Books" WHERE "Books"."game_id" = 1 AND "Books"."user_id" = 2 LIMIT 1;
Executing (default): UPDATE "Books" SET "price"=$1 WHERE "id" = $2
Executing (14d60769-e10f-4710-97c6-39d8d4eac848): COMMIT;
Теперь вопрос - действительно ли в этом случае применяется транзакция, или это просто срабатывает объявление const t = await sequelize.transaction(); и await t.commit();?
Спрашиваю, потому что я пробовал выполнять вот такой код без вложений других запросов между ним:
const t = await sequelize.transaction();
await t.commit();
и в консоль попадало это:
Executing (8edf75bb-dd6e-44d0-a03f-efd5862150df): START TRANSACTION;
Executing (8edf75bb-dd6e-44d0-a03f-efd5862150df): COMMIT;
Тут же видно что Вы запустили транзакцию 14d60769-e10f-4710-97c6-39d8d4eac848 но не передали ее в запрос поэтому запросы выполнились в транзакции default, т.е. откатить Вы эти запросы не сможете,а вот если бы Вы передали транзакцию в апдейт, то он бы выглядел Executing (8edf75bb-dd6e-44d0-a03f-efd5862150df): UPDATE "users" SET "balance"=$1 WHERE "id" = $2, то есть происходил в контексте данной транзакции. Более того допустим Вы запустите транзакцию и в контексте транзакции а сделаете инсерт, а селект того что заинсертили сделаете не передав транзакциию, то селект ничего не найдет, так как он не в контексте