How Change Tracking Handles Changes to a Database
Niektóre aplikacje używające śledzenia zmian wykonania synchronizacji dwukierunkowej z innego magazynu danych.Oznacza to, zmiany dokonane w SQL Server bazy danych są aktualizowane w magazynie danych, a zmiany dokonane w innym magazynie są aktualizowane w SQL Server Baza danych.
Gdy aplikacja aktualizacji lokalnej bazy danych zmiany z innego magazynu danych, aplikacja musi wykonać następujące operacje:
Sprawdź, czy jest w konflikcie.
Konflikt występuje wtedy, gdy te same dane w tym samym czas w obydwu magazynach danych.Aplikacja musi być w stanie sprawdzić, czy konflikt i uzyskać wystarczających informacji, aby włączyć konfliktu jest rozpoznawana.
Przechowywanie informacji kontekstu aplikacji.
Aplikacja przechowuje dane, które mają zmian informacji.Ta informacja będzie dostępny wraz z inną zmianę informacji śledzenia, gdy zmiany zostały uzyskane z lokalnej bazy danych.Typowym przykładem tej informacji kontekstowych jest identyfikatorem magazynu danych, który był urządzenie źródłowe o zmianie.
Wykonywanie poprzedniej operacji, aplikacja synchronizacji można używać następujących funkcji:
CHANGETABLE(wersja…)
Podczas wprowadzania zmian w aplikacji, jej użyć tej funkcja, aby sprawdzić, czy nie występują konflikty.Funkcja uzyskuje najnowszych zmian informacji dla określonego wiersza tabela prześledzonych zmian.Śledzenie informacji zmian zawiera wersja wiersz, który był ostatnio zmieniany.Informacja ta umożliwia aplikacji w celu ustalenia, czy wiersz został zmieniony od ostatniego aplikacji został zsynchronizowany.
Z CHANGE_TRACKING_CONTEXT
Aplikacji służy do przechowywania danych w kontekście tej klauzula.
Sprawdzanie konfliktów
W scenariuszu synchronizacji dwukierunkowej aplikacja kliencka musi określić, czy wiersz nie została zaktualizowana, ponieważ aplikacja uzyskane ostatniej zmiany.
W poniższym przykładzie pokazuje sposób użycia funkcja CHANGETABLE(wersja …), aby sprawdzić, czy nie występują konflikty w najbardziej efektywny sposób bez oddzielną kwerendę.In the example, CHANGETABLE(VERSION …) determines the SYS_CHANGE_VERSION for the row specified by @product id.CHANGETABLE(CHANGES …) can obtain the same information, but that would be less efficient.Jeśli wartość SYS_CHANGE_VERSION w wierszu jest większa niż wartość @last\_sync\_version, występuje konflikt. Jeśli występuje konflikt, wiersz nie będzie aktualizowany.The ISNULL() check is required because there might be no change information available for the row.Brak informacji o zmianie czy istnieją nie wiersza zostały zaktualizowane od czasu włączenia śledzenia zmian lub ponieważ informacje o zmianie został oczyszczony.
-- Assumption: @last_sync_version has been validated.
UPDATE
SalesLT.Product
SET
ListPrice = @new_listprice
FROM
SalesLT.Product AS P
WHERE
ProductID = @product_id AND
@last_sync_version >= ISNULL (
SELECT CT.SYS_CHANGE_VERSION
FROM CHANGETABLE(VERSION SalesLT.Product,
(ProductID), (P.ProductID)) AS CT),
0)
W poniższym kodzie może sprawdzić, czy liczba zaktualizowanych wierszy i można określić więcej informacji na temat konfliktu.
-- If the change cannot be made, find out more information.
IF (@@ROWCOUNT = 0)
BEGIN
-- Obtain the complete change information for the row.
SELECT
CT.SYS_CHANGE_VERSION, CT.SYS_CHANGE_CREATION_VERSION,
CT.SYS_CHANGE_OPERATION, CT.SYS_CHANGE_COLUMNS
FROM
CHANGETABLE(CHANGES SalesLT.Product, @last_sync_version) AS CT
WHERE
CT.ProductID = @product_id;
-- Check CT.SYS_CHANGE_VERSION to verify that it really was a conflict.
-- Check CT.SYS_CHANGE_OPERATION to determine the type of conflict:
-- update-update or update-delete.
-- The row that is specified by @product_id might no longer exist
-- if it has been deleted.
END
Ustawianie informacji o kontekstu
Przy użyciu klauzula WITH CHANGE_TRACKING_CONTEXT, aplikacja może przechowywać informacje kontekstu wraz z informacjami zmiany.Te informacje można następnie uzyskać od kolumna SYS_CHANGE_CONTEXT, który jest zwracany przez CHANGETABLE(CHANGES …).
Informacje kontekstowe jest zazwyczaj używane do identyfikowania urządzenie źródłowe zmiany.Jeśli można zidentyfikować urządzenie źródłowe o zmianie, można używać tych informacji przez Magazyn danych w celu uniknięcia uzyskania zmiany podczas synchronizuje je ponownie.
-- Try to update the row and check for a conflict.
WITH CHANGE_TRACKING_CONTEXT (@source_id)
UPDATE
SalesLT.Product
SET
ListPrice = @new_listprice
FROM
SalesLT.Product AS P
WHERE
ProductID = @product_id AND
@last_sync_version >= ISNULL (
(SELECT CT.SYS_CHANGE_VERSION FROM CHANGETABLE(VERSION SalesLT.Product,
(ProductID), (P.ProductID)) AS CT),
0)
Zapewnienie zgodności i popraw wyniki
Aplikacji należy wziąć pod uwagę procesu oczyszczania, gdy go sprawdza poprawność wartości @ last_sync_version.Jest to, ponieważ dane może zostały usunięte po CHANGE_TRACKING_MIN_VALID_VERSION() została wywołana, ale przed dokonaniem zmiany tej aktualizacji.
Important Note: |
|---|
Zaleca się używać izolacji migawka, a następnie wprowadź odpowiednie zmiany w transakcji migawka. |
-- Prerequisite is to ensure ALLOW_SNAPSHOT_ISOLATION is ON for the database.
SET TRANSACTION ISOLATION LEVEL SNAPSHOT;
BEGIN TRAN
-- Verify that last_sync_version is valid.
IF (@last_sync_version <
CHANGE_TRACKING_MIN_VALID_VERSION(OBJECT_ID(‘SalesLT.Product’)))
BEGIN
RAISERROR (N’Last_sync_version too old’, 16, -1);
END
ELSE
BEGIN
-- Try to update the row.
-- Check @@ROWCOUNT and check for a conflict.
END
COMMIT TRAN
Uwaga
Istnieje możliwość, że wiersz jest aktualizowane w transakcji migawka może zostały zaktualizowane w innej transakcji po transakcji migawka został uruchomiony.W takim przypadek konflikt aktualizacji izolacji migawka będzie występować i prowadzić do transakcja zostanie zakończona.W takim przypadku należy ponowić próbę aktualizacji.Następnie będzie to prowadzić do zmian jest wykryto konflikt i nie wierszy przed zmianami.
See Also
Important Note: