Transaction¶
Ilorm support transaction with the Transaction class.
const { Transaction } = require('ilorm');
You could use Transaction object directly;
const transaction = new Transaction();
try {
  Model.query({ transaction })
    // do something
  await transaction.commit();
} catch(err) {
  await transaction.rollback();
}
Transaction.run(async (transaction) => {
  Model.query({ transaction })
    // do something
})
(static) (async) Transaction.run(hander)¶
Create a context of transaction and run the handler. If an exception is throw, the transaction is rollback. If the run is done without exception, the transaction is commit.
// If node support async local storage (Node 14 and above);
Transaction.run(async () => {
  // Every ilorm stuff done here, are managed by the transaction;
  const invoice = await Invoice.query()
    .id.is(invoiceId)
    .findOne();
  const userAcount = await Account.query()
    .userId.is(invoice.userId)
    .findOne();
  if (userAccount.balance >= invoice.amount) {
    invoice.isPaid = true;
    userAccount.balance -= invoice.amount;
    await Promise.all([
      invoice.save(),
      userAccount.save(),
    ]);
  }
});
// If node does not support local storage
Transaction.run(async (transaction) => {
  // Every ilorm stuff done here, are managed by the transaction;
  const invoice = await Invoice.query({ transaction }) // First way to bind a transaction to a query
    .id.is(invoiceId)
    .findOne();
  const userAcount = await Account.query()
    .transaction(transaction) // Alternative way to bind a transaction to a query
    .userId.is(invoice.userId)
    .findOne();
  if (userAccount.balance >= invoice.amount) {
    invoice.isPaid = true;
    userAccount.balance -= invoice.amount;
    await Promise.all([
      invoice.save({ transaction }),
      userAccount.save({ transaction }),
    ]);
  }
});
(async) Transaction.commit();¶
Apply transaction
(async) Transaction.rollback();¶
Rollback transaction