Transaction

Hight-level transaction management

For simple transaction management, you can use the transaction method in the connection object. This method:

  • begins the transaction before calling the function received by argument
  • commits the transaction if the resulting promise returns a result
  • rollbacks the transaction if the resulting promise returns an error
const transactionResult = connection.transaction(async () => {
    const companyId = await connection.insertInto ...
    const customerId = await connection.insertInto ...

    return {companyId, customerId};
});

The transaction method have two overloads:

  • transaction<T>(fn: () => Promise<T>[]): Promise<T[]>
  • transaction<T>(fn: () => Promise<T>): Promise<T>

Low-level transaction management

Sometimes a fine-grain control over the transaction is required, in that situations ts-sql-query offer you the possibility to manually:

  • begin the transaction
await connection.beginTransaction();
  • commit the transaction
await connnection.commit();
  • rollback the transaction
await connection.rollback();

When you use these methods, you must ensure the transaction begin before call commit or rollback.

Defering execution till transaction ends

You can defer the execution of a logic till the end of the transaction. This defered logic can be set calling the executeAfterNextCommit or executeAfterNextRollback of the ts-sql-query connection at any moment of the application execution; the only condition is there must be an active transaction. ts-sql-query offer as well defer the execution of a logic till just before the commit calling executeBeforeNextCommit.

connection.executeAfterNextCommit(async () => {
    // Logic defered till the commit is executed
    console.log('After next commit')
})

connection.executeAfterNextRollback(async () => {
    // Logic defered till the rollback is executed
    console.log('After next rollback')
})

connection.executeBeforeNextCommit(async () => {
    // Logic defered till just before the commit is executed
    console.log('Before next commit')
})

Note: The provided function can be a sync function that returns void or an async function that returns a promise of void.

Transaction metadata

You can set additional information to be consumed in other parts of the application during the same transaction. For this, you can call getTransactionMetadata of the ts-sql-query connection at any moment of the application execution; the only condition is there must be an active transaction. The getTransactionMetadata method will return a Map<unknown, unknown> where you can get or set values.

// Setting a value
connection.getTransactionMetadata().set('my key', 'my value')
// Getting a value
const myKeyValue: unknown = connection.getTransactionMetadata().get('my key')