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);
    final mainRow =
        result.rows.isNotEmpty ? resultSetToMaps(result).first : null;

    // Rebuild relation mutations from the RETURNING row so DB-generated
    // parent ids are used (fixes nested writes on @default(uuid()) create).
    final relationMutations =
        compiler.buildRelationMutationsFromResult(query, mainRow);
    for (final relationQuery in relationMutations) {
      await txExecutor.transaction.executeRaw(relationQuery);
    }

    return mainRow;
  }, isolationLevel: isolationLevel);
}