Dit artikel begint met een redeneerprobleem. Wie langer met Mendix werkt, leert twee principes:

  • Commit niet binnen een loop. Dat heeft grote gevolgen voor de performance van de microflow; commit buiten de loop, dan wordt alles in één keer gecommit.
  • Een Mendix-microflow bestaat doorgaans uit één databasetransactie, die opent bij de eerste activiteit die met de database praat (retrieve, commit, delete of create-commit) en altijd eindigt, met een commit van alles, aan het einde van de microflow.

Kijk goed en deze twee uitspraken passen niet bij elkaar, in elk geval niet zoals ze zijn geformuleerd. Als er maar één transactie is die aan het einde alles commit, wat doen mijn honderden commits dan in een microflow die binnen een loop commit? Dat zou betekenen dat een Mendix-commit geen databasecall is. En als dat zo is, waarom zou ik dan nog onderscheid maken tussen committen binnen of buiten een loop?

Wat de documentatie zegt

De documentatie van Mendix legt uit hoe de commit-activiteit werkelijk werkt:

“When you commit an object, the current value is saved. This means that you cannot roll back to the previous values of the object using the rollback object activity of a microflow. However, a Mendix commit is not the same as a database commit. For an object of a persistable entity, the saved value is not committed to the database until the microflow and any microflows from which it is called, complete.”

Een commit-activiteit is dus geen echte databasecommit. Het bevestigt ook de tweede uitspraak: alles wordt pas aan het einde van de microflow werkelijk in de database gecommit.

SQL-commits en savepoints

In pure SQL is de data van een INSERT alleen zichtbaar in uw eigen sessie, totdat u een COMMIT uitvoert. Committen betekent: uw data beschikbaar maken voor andere gebruikers van de database.

Een Mendix-commit lijkt eigenlijk meer op een SQL INSERT of UPDATE plus een SAVEPOINT. Hij doet direct een databasecall, maar de data wordt pas vrijgegeven aan andere sessies (de SQL COMMIT) wanneer de microflow succesvol is afgerond. Elke commit-activiteit in Mendix stuurt de data dus direct naar de database, maakt een savepoint voor een eventuele rollback, en houdt de data onzichtbaar voor andere sessies tot het einde van de microflow.

Gevolgen voor de performance

Dit verklaart waarom committen in een loop de performance raakt. Elke commit doet een rondje naar de database, maakt een nieuw savepoint en zorgt voor extra transactiebeheer. Buiten de loop committen betekent één rondje en één savepoint, hoeveel objecten u ook opslaat.

Conclusie

Het verschil tussen Mendix-commits en databasecommits begrijpen is essentieel om performante microflows te schrijven. Commit waar mogelijk buiten loops, en onthoud dat de echte databasecommit pas plaatsvindt als uw microflow succesvol is afgerond.