transactional<T> method

Future<T> transactional<T>(
  1. FutureOr<T> callback(
    1. MySQLConnection conn
    )
)

Execute callback inside database transaction

If MySQLClientException is thrown inside callback function, transaction is rolled back

Implementation

Future<T> transactional<T>(
    FutureOr<T> Function(MySQLConnection conn) callback) async {
  // prevent double transaction
  if (_inTransaction) {
    throw MySQLClientException("Already in transaction");
  }
  _inTransaction = true;

  await execute("START TRANSACTION");

  try {
    final result = await callback(this);
    await execute("COMMIT");
    _inTransaction = false;
    return result;
  } catch (e) {
    await execute("ROLLBACK");
    _inTransaction = false;
    rethrow;
  }
}