Was schreibt Oracle bei einem INSERT in den UNDO-Block?

25. Dezember 2012 Aus Von Markus Flechtner

Die Frage hat letztens einer meiner Kursteilnehmer gestellt und ich gebe zu, ich habe etwas darüber nachdenken müssen. Die Antwort ist aber relativ einfach.

Aber zuerst einmal: was muss Oracle nicht in den Undo-Block schreiben? Ganz klar, das “Before-Image”, die alten Daten, die vorher in dem Datensatz waren. Das wird wird beim UPDATE oder DELETE gemacht, denn da müssen die geänderten bzw. gelöschten Daten wiederhergestellt werden können.

Was macht Oracle denn bei einem INSERT? Sehr verkürzt ausgedrückt, sucht Oracle einen “freien” Block in dem Segment und legt dort einen neuen Datensatz an, in dem die neuen Daten dort abgelegt werden. Ein derartiger Datensatz wird – wie immer bei Oracle – über die ROWID identifiziert. Und was müsste Oracle machen, wenn der INSERT rollback-ed würde? Oracle muss den Datensatz löschen (DELETE). Dazu benötigt Oracle die ROWID des Datensatzes. Und genau diese schreibt Oracle beim INSERT in den Undo-Block: die ROWID des neuen Datensatzes. Das ist zwar nur eine minimale Datenmenge (die ROWID ist ja nur 10 Byte groß), aber ganz ohne UNDO geht es nicht.

Wieder mal was gelernt .. 🙂