# MOSAIC Storage-Engines und Transaktionen

## Grundregel fuer Kundenprojekte

Bei MySQL/MariaDB muss ein MOSAIC-Projekt konsistent mit genau einer Storage-Engine betrieben werden:

- entweder nur `MyISAM`
- oder nur `InnoDB`

Ein Mischbetrieb innerhalb eines fachlichen Prozesses wird fuer die Transaktionslogik nicht empfohlen und soll im Projekt vermieden werden.

## Wichtige Abgrenzung

- `db_typ` beschreibt in MOSAIC den Datenbanktreiber bzw. SQL-Zieltyp, zum Beispiel `mysql`, `pgsql`, `oracle` oder `sqlite`.
- In der `db_connection.lic` heisst der Verbindungsschalter weiterhin `type`.
- Bei `db_typ = pgsql` verwendet MOSAIC im Kern durchgaengig den PostgreSQL-Dialekt `pgsql`.
- Die Storage-Engine ist bei MySQL/MariaDB eine Eigenschaft der Tabelle, zum Beispiel `InnoDB` oder `MyISAM`.

## Neue Form-Konfiguration

Im `*_form.cfg` kann jetzt auf oberster Ebene der Schalter `transaction` gesetzt werden.

Beispiel:

```php
return [
    'table' => 'beispiel_tabelle',
    'primary_key' => 'beispiel_id',
    'transaction' => true,
    'tabs' => [
        // ...
    ],
];
```

## Wirkung von `transaction`

- Fehlt der Eintrag `transaction`, dann gilt automatisch `false`.
- Ist `transaction = false`, arbeitet MOSAIC wie bisher ohne Transaktionssteuerung.
- Ist `transaction = true` und die Zieltabelle hat unter `mysql` die Engine `InnoDB`, dann fuehrt `form.php` den Schreibvorgang innerhalb einer echten Datenbank-Transaktion aus.
- Ist `transaction = true`, die Tabelle hat aber die Engine `MyISAM`, dann passiert bewusst nichts Transaktionales.
- Ist `transaction = true` und der Treiber ist `pgsql`, dann fuehrt `form.php` den Schreibvorgang innerhalb einer echten Datenbank-Transaktion aus.
- Ist `transaction = true` und der Treiber ist `oracle`, dann fuehrt `form.php` den Schreibvorgang innerhalb einer echten Datenbank-Transaktion aus.
- Bei anderen Datenbanktypen passiert vorerst nichts Transaktionales.

## Aktueller Geltungsbereich

Die neue Logik ist aktuell im MOSAIC-Kern fuer den Runner `_pgm/form.php` umgesetzt.

Bei aktivem Transaktionsmodus umfasst der Transaktionsrahmen:

1. `onBeforeInsert`, `onBeforeUpdate`, `onBeforeDelete`
2. die eigentliche Insert-, Update- oder Delete-Operation
3. `onAfterInsert`, `onAfterUpdate`, `onAfterDelete`
4. danach `COMMIT`

Tritt in diesem Ablauf ein Fehler auf, wird bei aktiver Datenbank-Transaktion ein `ROLLBACK` ausgefuehrt.

## Wichtige Einschraenkung

Die neue Logik sichert aktuell den Datenbankablauf im Form-Runner ab.

Dateisystem-Operationen wie Uploads, Datei-Loeschungen oder sonstige externe Seiteneffekte sind damit noch nicht vollstaendig rollback-faehig. Fuer fachlich harte Transaktionsketten sollen deshalb die eigentlichen Datenbanktabellen konsistent auf `InnoDB` ausgelegt und Hook-Logik moeglichst innerhalb derselben PDO-Verbindung gehalten werden.

## Empfehlung

Fuer neue Projekte mit fachlichen Abhaengigkeiten, referenziellen Beziehungen und Rollback-Anforderungen soll unter `mysql` `InnoDB` verwendet werden. Unter `pgsql` und `oracle` kann derselbe Form-Schalter direkt genutzt werden.

`MyISAM` bleibt nur ein Modus ohne Transaktionsgarantie.
## Runner-Stand im Kern

Stand April 2026 gilt im MOSAIC-Kern ein einheitliches Runner-Schema:

- `grid.php`, `form.php` und `show_egrid.php` bilden die kanonischen CRUD-Einstiege; `show_egrid.php` delegiert intern an `egrid.php`
- alle anderen fachlichen Runner verwenden konsequent das Praefix `show_`
- typische Beispiele sind `show_menu.php`, `show_dashboard.php`, `show_report.php`, `show_chart.php`, `show_login.php` und `show_v_menu.php`
- fruehere Alt-Namen sind nicht mehr Bestandteil des aktiven Kernbereichs