Imperative transactions
Both, Declarative and Imperative transactions
are supported for flexibility, with the former you can just describe the scope of your transactions, with the later you have more flexibility to programmatically specify the lifecycle of a transaction.
Use Imperative
transactions as below:
- get the
querier
instance withawait getQuerier()
. - run the transaction with
await querier.transaction(callback)
. - perform the different operations using the same
querier
(orrepositories
) inside yourcallback
function.
import { getQuerier } from 'nukak'; async function confirm(confirmation: Confirmation): Promise<void> { const querier = await getQuerier(); await querier.transaction(async () => { if (confirmation.action === 'signup') { await querier.insertOne(User, { name: confirmation.name, email: confirmation.email, password: confirmation.password, }); } else { await querier.updateOneById(User, confirmation.creatorId, { password: confirmation.password, }); } await querier.updateOneById(Confirmation, confirmation.id, { status: 1 }); }); }
That ▲ code can also be implemented as this ▼ (for more granular control):
async function confirm(confirmation: Confirmation): Promise<void> { const querier = await getQuerier(); try { await querier.beginTransaction(); if (confirmation.action === 'signup') { await querier.insertOne(User, { name: confirmation.name, email: confirmation.email, password: confirmation.password, }); } else { await querier.updateOneById(User, confirmation.creatorId, { password: confirmation.password, }); } await querier.updateOneById(Confirmation, confirmation.id, { status: 1 }); await querier.commitTransaction(); } catch (error) { await querier.rollbackTransaction(); throw error; } finally { await querier.release(); } }