Я использую управляемые транзакции в своем проекте, и у меня есть случай, когда я хотел бы использовать одну транзакцию и выполнить откат до указанной c точки сохранения в случае сбоя, но всегда фиксировать в конец.
Например, я хочу создать Event
и попытаться запустить action
. Если action
не удается, я хочу отменить любую активность базы данных, которая произошла во время действия, но сохранить запись Event
и впоследствии обновить ее результатом.
const transaction = await sequelize.transaction();
const event = await Event.create({ ... }, { transaction });
// I want to mark the savepoint here
try {
const action = await runAction(transaction);
event.status = 'success';
event.action_id = action.id;
} catch (err) {
// This is where I want to rollback any changes since the savepoint
event.status = 'failure';
event.failure_message = err.message;
}
await event.save({ transaction });
await transaction.commit();
Насколько я понимаю, я должен иметь возможность достичь этого, создав новую транзакцию с существующей, эффективно пометив точку сохранения:
const transaction = await sequelize.transaction();
const event = await Event.create({ ... }, { transaction });
const savepoint = await sequelize.transaction({ transaction });
try {
const action = await runAction(savepoint);
...
} catch (err) {
await savepoint.rollback();
...
}
await event.save({ transaction });
await transaction.commit();
Однако это не работает, и все операции, использующие транзакцию в runAction
, по-прежнему фиксируются . Есть ли способ добиться этого?