Click here to view and discuss this page in DocCommentXchange. In the future, you will be sent there automatically.

SQL Anywhere 12.0.0 (Deutsch) » MobiLink - Serveradministration » MobiLink-Servertechnologie verwenden » Synchronisationsmethoden » Konfliktbehandlung » Konflikte erkennen

 

Konflikte erkennen mit upload_fetch- oder upload_fetch_column_conflicts-Skripten

Wenn Sie ein upload_fetch- oder upload_fetch_column_conflict-Skript für eine Tabelle definieren, vergleicht der MobiLink-Server das Pre-Image einer hochgeladenen Aktualisierung mit den Werten in der vom Skript zurückgegebenen Zeile mit denselben Primärschlüsselwerten. Der MobiLink-Server erkennt einen Konflikt, wenn Werte im Pre-Image nicht mit den aktuellen Werten in der konsolidierten Datenbank übereinstimmen. Der Server ruft die Skripten upload_old_row_insert und upload_new_row_insert auf, gefolgt vom Skript resolve_conflict, sobald ein Konflikt festgestellt wird.

Hinweis

Ein Fehler tritt auf, wenn die Skripten upload_old_row_insert und upload_new_row_insert während eines Konflikts nicht definiert sind. Definieren Sie diese Skripten unter Verwendung der Anweisung --{ml_ignore} als ignoriert, wenn sie für die Synchronisationstabelle nicht mehr benötigt werden.

Der Unterschied zwischen den Skripten upload_fetch und upload_fetch_column_conflict liegt in den Kriterien, die der MobiLink-Server verwendet, um einen Konflikt zu erkennen. Bei einem upload_fetch-Skript werden alle Unterschiede zwischen der abgerufenen Zeile und der Pre-Image-Zeile als Konflikt behandelt. Bei einem upload_fetch_column_conflict-Skript werden nur die von der entfernten Datenbank aktualisierten Spalten zwischen der abgerufenen Zeile und der Pre-Image-Zeile verglichen. Mit anderen Worten: upload_fetch bietet zeilenbasierte Konflikterkennung und upload_fetch_column_conflict bietet spaltenbasierte Konflikterkennung.

Das upload_fetch-Skript wählt eine einzelne Datenzeile aus einer Tabelle einer konsolidierten Datenbank, die der zu aktualisierenden Zeile entspricht. Sie können dieses Skript auf zweierlei Art verwenden. Die erste Möglichkeit besteht darin, die Zeile mit denselben Primärschlüsseln und denselben Spaltenwerten auszuwählen wie das hochgeladene Pre-Image. Wenn keine Zeile zurückgegeben wird, erkennt der MobiLink-Server einen Konflikt. Diese Verwendung des Skripts hat die folgende Syntax:

SELECT Ps1, Ps2, ...Sp1, Sp2, ...
FROM Tabellenname
WHERE Ps1 = {ml r.Ps1} AND Ps2 = {ml r.Ps2} ...
   AND Sp1 = {ml o.Sp1} AND Sp2 = {ml o.Sp2} ...
Hinweis

Diese Methode für die Konflikterkennung kann nicht auf synchronisierte Tabellen angewendet werden, die große Binärspalten wie BLOB und CLOB enthalten.

Die zweite Möglichkeit besteht darin, die Zeile mit demselben Primärschlüssel auszuwählen und den MobiLink-Server die abgerufene Zeile mit dem hochgeladenen Pre-Image vergleichen zu lassen. Wenn sich Spalten unterscheiden, erkennt der MobiLink-Server einen Konflikt. Diese Methode funktioniert mit allen synchronisierbaren Spaltentypen:

SELECT Ps1, Ps2, ...Sp1, Sp2, ...
FROM Tabellenname
WHERE Ps1 = {ml r.Ps1} AND Ps2 = {ml r.Ps2} ...

Siehe upload_fetch (Tabellenereignis).

Das Ereignis upload_fetch_column_conflict ist dasselbe wie upload_fetch, außer dass bei ihm der MobiLink-Server nur dann einen Konflikt für eine Zeile erkennt, wenn seit der letzten Synchronisation dieselbe Spalte in der entfernten Datenbank und in der konsolidierten Datenbank aktualisiert wurde. Verschiedene Benutzer können dieselbe Zeile aktualisieren, ohne einen Konflikt zu generieren, sofern sie nicht dieselbe Spalte aktualisieren. Das Ereignis upload_fetch_column_conflict kann nur auf Synchronisationstabellen angewendet werden, die keine BLOBs enthalten.

Wenn Sie ein upload_fetch_column_conflict-Skript verwenden und kein Konflikt erkannt wird, stammen die in Ihr upload_update-Skript übergebenen Zeilenwerte entweder aus dem Upload der entfernten Datenbank oder aus den aktuellen Werten der konsolidierten Datenbank gemäß Ihrem upload_fetch_column_conflict-Skript. Der Wert der entfernten Datenbank wird für Spalten verwendet, die in der entfernten Datenbank aktualisiert wurden. Andernfalls wird der aktuelle Wert der konsolidierten Datenbank verwendet. Mit anderen Worten: Nur die Spalten, die in der entfernten Datenbank aktualisiert wurden, werden in der konsolidierten Datenbank aktualisiert.

Siehe upload_fetch_column_conflict (Tabellenereignis).

Für jede Tabelle in der entfernten Datenbank kann ein upload-fetch- oder ein upload_fetch_column_conflict-Skript vorhanden sein.

 Die Zeile in der konsolidierten Datenbank sperren
 Beispiel