Nicht genug damit, jetzt können auch ETags für wertebasierte Concurrency Control verwendet werden. Was bedeutet das und was sind überhaupt ETags? Ein "ETag" (kurz für Entity Tag) ist ein mit HTTP eingeführtes Header-Feld zur Bestimmung von Änderungen angeforderter Ressourcen (Quelle: Wikipedia).
Wie kann das in der Oracle-Datenbank genutzt werden? Mit JSON-Dokumenten über die sogenannten JSON Relational Duality Views oder die neuen JSON Collection Tables sind ETags automatisch oder im Fall der Collection Tables über die zusätzliche Klausel WITH ETAG im Dokument-Header enthalten und können zum Abgleich bei Änderungen an den JSON-Dokumenten genutzt werden.
Aber auch SQL-Entwickler, die Updates an "regulären" Tabelleninhalten vornehmen, können von ETags profitieren – über die neue SQL Funktion SYS_ROW_ETAG. Die Funktion SYS_ROW_ETAG berechnet dabei einen ETag-Wert (einen 128-Bit-Hash-Wert) für eine Zeile unter Verwendung der Werte bestimmter, vom User ausgewählter Spalten. Das heißt, alle Spalten, bei denen man sich sicher sein will, dass keine andere Session sie gleichzeitig geändert hat, werden in die Berechnung mit aufgenommen.
Folgendes Beispiel zeigt die Funktionsweise:
Zuerst erzeugen wir eine Tabelle TESTVALUES und fügen drei Zeilen ein:
SQL> create table testvalues (t number, t1 number, x number);
Table created.
Hier wird das neue 23ai Multi-Value INSERT-Kommando genutzt, um drei Werte mit einer einzigen Operation einzufügen:
SQL> insert into testvalues values (1,1,1),(2,2,1),(3,3,1);
3 rows created.
SQL> commit;
Commit complete.
Im nächsten Schritt berechnen wir den ETag-Wert für die Spalten T und T1:
SQL> select t, t1, x, SYS_ROW_ETAG(t,t1) ETAG
from testvalues where t=1;
T T1 X ETAG
-------- --------- ----- ------------------------------------------------------------
1 1 1 FF225F5D85CF60203653349D199F789D
Nach einem UPDATE an der Spalte X, die nicht Teil der Berechnung war, gibt es natürlich keine Änderung am berechneten ETag-Wert:
SQL> update testvalues set x=3 where t=1;
1 row updated.
SQL> commit;
Commit complete.
SQL> select t, t1, x, SYS_ROW_ETAG(t,t1) ETAG
from testvalues where t=1;
T T1 X ETAG
---------- -------- ---- ------------------------------------------------------------
1 1 3 FF225F5D85CF60203653349D199F789D
Nun verändern wir eine der beteiligten Spalten – hier T1:
SQL> update testvalues set t1=2 where t=1;
1 row updated.
SQL> commit;
Commit complete.
Der ETag-Wert hat sich gändert.
SQL> select t, t1, x, SYS_ROW_ETAG(t,t1) ETAG
from testvalues where t=1;
T T1 X ETAG
--------- --------- ----- ----------------------------------------------------------
1 2 3 3B978191AD0C828DA0E6A53EDF0B278A
Nutzen wir jetzt den "alten", nicht aktuellen Wert im Filter, wird keine Zeile geändert:
SQL> update testvalues set x=5
where t=1 and
SYS_ROW_ETAG(t,t1)='FF225F5D85CF60203653349D199F789D';
0 rows updated.
Mit dem aktuellen Wert hingegen wird die Zeile verändert:
SQL> update testvalues set x=5
where t=1 and
SYS_ROW_ETAG(t,t1)='3B978191AD0C828DA0E6A53EDF0B278A';
1 row updated.
So können Datenbank-User ETag-Werte für ausgewählte Datenbankspalten mit der neuen Funktion SYS_ROW_ETAG erzeugen und dabei berücksichtigen, welche Spalten an der ETag-Berechnung teilnehmen sollen.
Mehr dazu online in der YouTube ORATECH 23ai Playlist oder im Oracle-Blog.


