Ein Select ist eine Massenoperation und muss optimiert werden. Deshalb müssen UDF's so einfach wie irgend möglich gestaltet werden.
Du kannst ja nicht verhindern, wo die UDF denn verwendet wird.
Ggf. fällt jemandem ein, dies in der Where-Klausel zu tun und dann kann im Zweifel ein Tablescan passieren statt eines Indexscans.

Schau dir das Transaktionsszenario an:
*CHG liest Daten die Committed sind.
Wenn du also bei einem Select, der 1000de und Millionen von Zeilen liest, eine UDF mit Commit verwendest stellst du den Optimizer vor gewaltige Probleme. Auch andere parallele Zugriffe aus anderen Verbindungen/Jobs werden ggf. Konsistenzprobleme bekommen.

Eine Transaktion in einer DB stellt grundsätzlich kein Problem dar.
Wenn sie denn via Businesslogik vom Client der DB initiiert und kontrolliert wird.
Denn wenn mir irgend eine UDF da dazwischen funkt, kann ich meiner Transaktion nicht mehr sicher sein und auf einen Rollback keinen konsistenten Zustand bekommen.

Ein Commit schreibt geänderte Daten fest!