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

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

 

Konflikte mit upload_fetch-Skripten erkennen

Wenn Sie ein upload_fetch-Skript oder ein upload_fetch_column_conflict-Skript für eine Tabelle definieren, vergleicht der MobiLink-Server das Pre-Image der Aktualisierung mit den Werten in der vom Skript upload_fetch zurückgegebenen Zeile mit denselben Primärschlüsselwerten. Falls Werte im Pre-Image nicht mit den aktuellen konsolidierten Werten übereinstimmen, erkennt der MobiLink-Server einen Konflikt.

Das upload_fetch-Skript wählt eine einzelne Datenzeile aus einer Tabelle einer konsolidierten Datenbank, die der zu aktualisierenden Zeile entspricht. Ein typisches upload_fetch-Skript hat folgende Syntax:

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

Weitere Hinweise finden Sie unter upload_fetch (Tabellenereignis).

Das Ereignis upload_fetch_column_conflict ist dem Ereignis upload_fetch ähnlich, erkennt einen Konflikt aber nur dann, wenn zwei Benutzer dieselbe Spalte aktualisieren. Verschiedene Benutzer können ein- und dieselbe Zeile aktualisieren, ohne einen Konflikt zu verursachen, aber nicht dieselbe Spalte.

Weitere Hinweise finden Sie unter 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

Es ist möglich, dass eine Zeile in der konsolidierten Datenbank geändert wird, nachdem das upload_fetch-Skript einen Konflikt erkennt und bevor die Konfliktlösung abgeschlossen ist. Um dieses Problem, das zu fehlerhaften Daten führen würde, zu vermeiden, können Sie die Skripten upload_fetch oder upload_fetch_column_conflicts mit einer Zeilensperre implementieren.

In konsolidierten SQL Anywhere-Datenbanken können Sie die Schlüsselwörter UPDLOCK oder HOLDLOCK verwenden, wobei UPDLOCK besser für den Mehrbenutzerbetrieb ist. Zum Beispiel:

SELECT Spaltennamen from Tabellenname WITH (UPDLOCK) 
  WHERE Where-Klausel

Bei Oracle, DB2 LUW und DB2 Mainframe verwenden Sie FOR UPDATE. Zum Beispiel:

SELECT Spaltennamen FROM Tabellenname
  WHERE Where-Klausel
    FOR UPDATE OF Spaltenname1, Spaltenname3, Spaltenname6
Hinweis

Durch das Festlegen der zu aktualisierenden Spaltennamen sparen Sie Computerressourcen und verbessern die Performance.

Bei Microsoft SQL Server verwenden Sie HOLDLOCK. Zum Beispiel:

SELECT Spaltennamen FROM Tabellenname WITH (HOLDLOCK)
  WHERE Where-Klausel

Bei Adaptive Server Enterprise verwenden Sie HOLDLOCK. Zum Beispiel:

SELECT Spaltennamen FROM Tabellenname
  HOLDLOCK 
  WHERE Where-Klausel
Beispiel

Sie definieren ein upload_fetch-Skript. Der MobiLink-Server ruft mit dem Skript die aktuelle Zeile in der konsolidierten Datenbank ab und vergleicht sie mit dem Pre-Image der aktualisierten Zeile. Wenn die beiden Zeilen identische Werte enthalten, liegt ein Konflikt vor. Enthalten die beiden Zeilen verschiedene Werte, wurde ein Konflikt erkannt und MobiLink ruft erst Skripten upload_old_row_insert und upload_new_row_insert und anschließend resolve_conflict auf.

Weitere Hinweise finden Sie unter Konflikte mit den resolve_conflict-Skripten lösen.