executeMutationWithRelationsAtomic method
Future<Map<String, dynamic> ?>
executeMutationWithRelationsAtomic(
- JsonQuery query, {
- 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);
}