Konflikte entstehen beim Upload von Zeilen in die konsolidierte Datenbank. Wenn zwei Benutzer dieselbe Zeile in zwei entfernten Datenbanken ändern, wird ein Konflikt erkannt, sobald die zweite Zeile den MobiLink-Server erreicht. Mithilfe von Synchronisationsskripten können Sie Skripten erkennen und auflösen.
Angenommen, zwei Clients verkaufen gleichzeitig bis zu zehn Artikel. Der erste Client verkauft drei Artikel, daher wird der Bestand in der Clientdatenbank remote1 aktualisiert, um sieben verbleibende Artikel anzuzeigen. Die Datenbank wird dann mit der konsolidierten Datenbank mlmon_db synchronisiert. Der zweite Client verkauft dann vier Artikel und aktualisiert seinen Bestand in seiner entfernten Datenbank remote2, um sechs verbleibende Artikel auszuweisen. Ein Konflikt wird erkannt, wenn Sie versuchen, eine Synchronisation mit mlmon_db vorzunehmen, weil sich der Lagerwert geändert hat.
Sie müssen die folgenden Zeilenwerte beziehen, um den Konflikt durch Programmcode zu lösen:
Den aktuellen Wert in der konsolidierten Datenbank.
Der Wert in der konsolidierten Datenbank ist 7, nachdem remote1 synchronisiert hat.
Der neue Zeilenwert, der von der remote2-Datenbank hochgeladen wird.
Der alte Zeilenwert, der von der remote2-Datenbank während der vorherigen Synchronisation bezogen wurde.
Sie können die folgende Geschäftslogik anwenden, um den neuen Bestandswert auszurechnen und den Konflikt zu beheben:
aktuelle konsolidierte DB - (alte entfernte DB - neue entfernte DB), d.h. 7 - (10-6) = 3 |
Der Ausdruck (alte entfernte DB - neue entfernte DB) liefert die Anzahl der Artikel, die der zweite Client verkauft hat, und nicht den absoluten Bestandswert.
Sie fügen die folgenden Skripten hinzu, um Konflikte zu erkennen und zu lösen:
upload_fetch Sie verwenden dieses Skript für das Abrufen von Zeilen aus einer Tabelle in der konsolidierten Datenbank für die Konflikterkennung.
upload_update Sie verwenden dieses Skript, um festzulegen, wie Daten, die in die entfernte Datenbank eingefügt werden, in der konsolidierten Datenbank übernommen werden. Sie können auch einen erweiterten Prototyp von upload_update für die Ermittlung von Updatekonflikten verwenden.
Weitere Hinweise zu upload_update finden Sie unter upload_update (Tabellenereignis).
upload_old_row_insert Mit diesem Skript können Sie alte Zeilenwerte verarbeiten, die von der entfernten Datenbank während der letzten Synchronisation abgerufen wurden.
Weitere Hinweise zu upload_old_row_insert finden Sie unter upload_old_row_insert (Tabellenereignis).
upload_new_row_insert Mit diesem Skript verarbeiten Sie neue Zeilenwerte (die aktualisierten Werte in der entfernten Datenbank).
Weitere Hinweise zu upload_new_row_insert finden Sie unter upload_new_row_insert (Tabellenereignis).
upload_delete Sie verwenden dieses Skript, um Zeilen zu verarbeiten, die aus der entfernten Datenbank gelöscht wurden. Der MobiLink-Server wird konfiguriert, dieses Ereignis für diese praktische Einführung zu ignorieren.
resolve_conflict Das Konfliktlösungsskript wendet Geschäftslogik für die Lösung des Konflikts an.
Weitere Hinweise zu resolve_conflict finden Sie unter resolve_conflict (Tabellenereignis).
Verwenden Sie Interactive SQL, um sich mit Ihrer Datenbank zu verbinden.
Sie können Interactive SQL über Sybase Central oder eine Eingabeaufforderung starten.
Um Interactive SQL aus Sybase Central zu starten, rechtsklicken Sie auf die MLconsolidated - DBA-Datenbank und auf Interactive SQL öffnen.
Um Interactive SQL an einer Eingabeaufforderung zu starten, führen Sie folgenden Befehl aus:
dbisql -c "dsn=mlmon_db" |
Installieren Sie die Skripten für die Konflikterkennung und -lösung.
Führen Sie folgendes SQL-Skript aus:
/* upload_fetch */ CALL ml_add_table_script( 'ver1', 'Product', 'upload_fetch', 'SELECT name, quantity FROM Product WHERE name = {ml r.name}' ); /* upload_update */ CALL ml_add_table_script( 'ver1', 'Product', 'upload_update', 'UPDATE Product SET quantity = {ml r.quantity}, last_modified = now() WHERE name = {ml r.name}' ); /* upload_old_row_insert */ CALL ml_add_table_script( 'ver1', 'Product', 'upload_old_row_insert', 'INSERT INTO Product_old (name,quantity,last_modified) VALUES ({ml r.name}, {ml r.quantity}, now())'); /* upload_new_row_insert */ CALL ml_add_table_script( 'ver1', 'Product', 'upload_new_row_insert', 'INSERT INTO Product_new (name,quantity,last_modified) VALUES ({ml r.name}, {ml r.quantity}, now())'); /* upload_delete */ CALL ml_add_table_script( 'ver1', 'Product', 'upload_delete', '--{ml_ignore}'); /* resolve_conflict */ CALL ml_add_table_script( 'ver1', 'Product', 'resolve_conflict', 'DECLARE @product_name VARCHAR(128); DECLARE @old_rem_val INTEGER; DECLARE @new_rem_val INTEGER; DECLARE @curr_cons_val INTEGER; DECLARE @resolved_value INTEGER; // obtain the product name SELECT name INTO @product_name FROM Product_old; // obtain the old remote value SELECT quantity INTO @old_rem_val FROM Product_old; //obtain the new remote value SELECT quantity INTO @new_rem_val FROM Product_new; // obtain the current value in cons SELECT quantity INTO @curr_cons_val FROM Product WHERE name = @product_name; // determine the resolved value SET @resolved_value = @curr_cons_val- (@old_rem_val - @new_rem_val); // update cons with the resolved value UPDATE Product SET quantity = @resolved_value WHERE name = @product_name; // clear the old and new row tables DELETE FROM Product_new; DELETE FROM Product_old'); COMMIT |
In dieser praktischen Einführung läuft der MobiLink-Server mit der -zf-Option, die es dem Server ermöglicht, Skripten zu erkennen, die während einer Synchronisation der konsolidierten Datenbank hinzugefügt wurden. Wenn diese Option nicht festgelegt ist, müssen Sie den MobiLink-Server stoppen, bevor Sie der konsolidierten Datenbank Skripten hinzufügen, und dann den Server nach dem Hinzufügen der neuen Skripten wieder starten.
Weitere Hinweise zur MobiLink-Konflikterkennung und -lösung finden Sie unter Konfliktbehandlung und Konflikte erkennen.
Weitere Hinweise zu konsolidierten MobiLink-Datenbanken finden Sie unter MobiLink - konsolidierte Datenbanken.
![]() |
Kommentieren Sie diese Seite in DocCommentXchange.
|
Copyright © 2010, iAnywhere Solutions, Inc. - SQL Anywhere 12.0.0 |