executeMutationWithRelationsAtomic method

Future<Map<String, dynamic>?> executeMutationWithRelationsAtomic(
  1. JsonQuery query, {
  2. IsolationLevel? isolationLevel,
})

Execute a mutation with relation operations inside a transaction.

This ensures atomicity - if any relation mutation fails, the entire operation is rolled back.

Example:

final result = await executor.executeMutationWithRelationsAtomic(
  JsonQueryBuilder()
      .model('SlotOfAppointment')
      .action(QueryAction.update)
      .where({'id': 'slot-123'})
      .data({
        'users': {
          'connect': [{'id': 'user-1'}],
          'disconnect': [{'id': 'user-2'}],
        },
      })
      .build(),
);

Implementation

Future<Map<String, dynamic>?> executeMutationWithRelationsAtomic(
  JsonQuery query, {
  IsolationLevel? isolationLevel,
}) async {
  return executeInTransaction<Map<String, dynamic>?>((txExecutor) async {
    // Compile with relation support
    final compiled = compiler.compileWithRelations(query);

    // Execute main mutation
    final result = await txExecutor.transaction.queryRaw(compiled.mainQuery);

    // Execute relation mutations
    for (final relationQuery in compiled.relationMutations) {
      await txExecutor.transaction.executeRaw(relationQuery);
    }

    // Return the created/updated record
    if (result.rows.isNotEmpty) {
      return _resultSetToMaps(result).first;
    }
    return null;
  }, isolationLevel: isolationLevel);
}