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 {
  if (_inTransaction) {
    throw MySQLClientException("Already in transaction");
  }
  _inTransaction = true;

  // Desativa o autocommit
  // await execute("SET autocommit = 0");
  await execute("START TRANSACTION");

  try {
    final result = await callback(this);
    await execute("COMMIT");
    // Reativa o autocommit após commit
    // await execute("SET autocommit = 1");
    _inTransaction = false;
    return result;
  } catch (e) {
    await execute("ROLLBACK");
    // Reativa o autocommit após rollback
    // await execute("SET autocommit = 1");
    _inTransaction = false;
    rethrow;
  }
}