FSROWID / FSROWVERSION
Mit der RowID-RowVersion-Logik werden Objekte gegen konkurrierende Transaktionen abgesichert. Dafür können in jeder DBTable 2 Datenbank-Spalten mit dem Namen FSROWID bzw. FSROWVERSION angegeben werden. Diese müssen mit der Einstellung IsRowID bzw. IsRowVersion gekennzeichnet werden. Siehe auch Kapitel DBTable.
In der Datenbank-Tabelle haben diese Spalten folgende Bedeutung:
FSROWID
Eine Guid-Spalte. Diese Spalte wird von Framework Studio beim Insert eines neuen Datensatzes generiert.
Die Datenbank-Spalten werden mit einem Default-Constraint angelegt. Dadurch werden sie automatisch befüllt, wenn Datensätze durch ein anderes Programm angelegt und kein Wert für diese Spalte angegeben wurde.
SQLServer Datatyp: uniqueidentifier
Oracle Datatyp: RAW(16)
Diese Spalte wird von Framework Studio als PrimaryKey-Spalte verwendet und dient beim Update und beim Nachlesen der eindeutigen Identifikation von Datensätzen.
Darüber hinaus in der DBTable definierte PK-Spalten sind dafür unerheblich. Diese haben lediglich den Effekt, dass Framework Studio ein Update auf diese Spalten unterbindet.
FSROWVERSION
Ein numerischer Zähler, der von Framework Studio bei jedem Update des Datensatzes hochgezählt wird. Dadurch werden konkurrierende Updates erkannt und verhindert. Beim Anlegen der Tabelle muss diese Spalte erzeugt werden.
Beim Anlegen neuer Tabellen müssen die Spalten wie folgt angelegt werden:
SQL-Server:
CREATE TABLE <table>
(
FSROWID uniqueidentifier NOT NULL DEFAULT (NEWSEQUENTIALID()) PRIMARY KEY CLUSTERED,
FSROWVERSION bigint, <columns>
);
Oracle:
CREATE TABLE <table>
(
FSROWID RAW(16) DEFAULT SYS_GUID() NOT NULL,
FSROWVERSION INTEGER,
<columns>
);
CREATE UNIQUE INDEX IXROWID_<table> ON <table> (FSROWID) TABLESPACE INDEX1;
Für die Spalten FSROWID und FSROWVERSION generiert FrameworkStudio in den Components entsprechende Properties. Diese sehen wie folgt aus:
- FSSystemGuid ROWID
- FSlong ROWVERSION
Das Property ROWID erhält seinen Wert unmittelbar beim Insert in die Datenbank. Der Wert steht also erst nach dem Insert zur Verfügung. Im OnBeforeSave hat somit das Property ROWID bei einem neuen Datensatz noch den Wert FSSystemGuid.Null.
Die Component prüft beim Save automatisch, ob der Datensatz auf der Datenbank zwischenzeitlich von einer anderen Instanz geändert wurde – sprich, ob sich der Wert in der Spalte FSROWVERSION geändert hat. Wenn das der Fall ist, dann wird eine RowVersionInvalidException geworfen.
An der Component gibt es folgende Methoden, mit denen dieser Exception vorgebeugt werden kann:
HasDbChanged()
ReloadData()