# Best Practices und häufige Stolperfallen

Gute Ninox Logik macht mehr, als nur das richtige Ergebnis zurückzugeben. Sie sollte auch vorhersehbar laufen, andere Nutzer nicht blockieren und leicht wartbar bleiben.

## **Transaktionen in Ninox verstehen**

Ninox führt Datenbankaktionen als Transaktionen aus. Eine Transaktion fasst einen oder mehrere Vorgänge zu einem Ausführungsschritt zusammen.

In der Praxis bedeutet das, dass Ninox das Lesen und Ändern von Daten unterschiedlich behandelt.

### **Lesetransaktionen**

Eine Lesetransaktion fragt Daten ab, ohne sie zu ändern.

Typische Beispiele sind:

* Datensätze in einer Tabelle filtern
* eine Abfrage ausführen, um passende Datensätze zu finden
* Werte lesen, um sie in der App anzuzeigen

Wenn Ninox eine Lesetransaktion startet, arbeitet es mit dem Datenstand, der in diesem Moment aktuell war. Änderungen, die andere Nutzer während derselben Abfrage speichern, sind nicht Teil dieses Ergebnisses.

Ninox kann viele Lesetransaktionen gleichzeitig verarbeiten. Ein Nutzer, der Daten liest, blockiert normalerweise keinen anderen Nutzer beim Lesen.

### **Schreibtransaktionen**

Eine Schreibtransaktion ändert Daten.

Typische Beispiele sind:

* einen Datensatz erstellen
* einen Feldwert bearbeiten
* einen Datensatz löschen
* auf einen Button klicken, der Daten aktualisiert
* Logik ausführen, die Werte zurück in die Datenbank schreibt

Es läuft immer nur eine Schreibtransaktion gleichzeitig. Andere Schreibtransaktionen warten, bis die aktuelle beendet ist.

Das ist meist kein Problem. Die meisten Schreibtransaktionen sind sehr schnell abgeschlossen.

{% hint style="info" %}
Automatisierungen wie **On create** und **On update** laufen innerhalb derselben Schreibtransaktion, die sie ausgelöst hat.
{% endhint %}

### **Ausführung auf Client und Server**

Ninox kann Logik auf dem Client oder auf dem Server ausführen.

Der Client ist die App, die auf dem Gerät eines Nutzers läuft. Der Server verarbeitet gemeinsam genutzte Datenbankoperationen im Hintergrund.

Wo Logik läuft, hängt davon ab, was die Aktion tun muss. Für die meisten Nutzer ist dieser Punkt entscheidend:

* Leseoperationen sind meist leichtgewichtig.
* Schreiboperationen müssen warten, bis sie an der Reihe sind.
* Lange Schreiboperationen können andere Schreibaktionen verlangsamen.

### **Warum Ninox langsam wirken kann**

Wenn Ninox langsam wirkt oder kurz nicht reagiert, blockiert möglicherweise eine längere Schreibtransaktion die Warteschlange.

Das passiert, wenn eine Aktion deutlich länger dauert als üblich und spätere Schreibaktionen warten müssen.

Häufige Ursachen sind:

* Aufrufe externer Dienste, zum Beispiel mit `http(...)`
* große Datenauswertungen in Kombination mit `select`
* komplexe Logik in Buttons oder Automatisierungen, die viele Datensätze aktualisiert

### **Wie du langsame Schreibtransaktionen vermeidest**

Halte Schreiblogik fokussiert und kurz.

Diese Gewohnheiten helfen:

* Lies und bereite Daten zuerst vor, wenn möglich.
* Halte API-Aufrufe wenn möglich aus kritischen Schreibabläufen heraus.
* Vermeide wiederholte `select`-Abfragen innerhalb von Schleifen.
* Teste Buttons und Automatisierungen mit realistischen Datenmengen.
* Teile große Updates wenn möglich in kleinere Schritte auf.

### **Eine praktische Denkweise dazu**

Nutze Lesetransaktionen, um Daten zu prüfen.

Nutze Schreibtransaktionen nur dann, wenn du eine Änderung speichern musst.

Je weniger Arbeit eine Schreibtransaktion erledigen muss, desto flüssiger fühlt sich die App für alle an.


---

# Agent Instructions: Querying This Documentation

If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://docs.ninox.com/ninox-scripting/de/automate-your-workflows/best-practices-and-common-pitfalls.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
