Jak zmienić śledzenia zmian dojścia do bazy danych
Niektóre aplikacje używające śledzenia zmian wykonywania dwukierunkowej synchronizacji z innego magazynu danych.Oznacza to, że zmiany wprowadzone w SQL Server bazy danych są aktualizowane w magazynie danych, a zmiany wprowadzone w magazynie inne są aktualizowane w SQL Server bazy danych.
Gdy aplikacja aktualizuje lokalnej bazy danych zmiany z innego magazynu danych, aplikacja musi wykonać następujące operacje:
Sprawdzić konflikty.
Konflikt występuje po zmianie tych samych danych w tym samym czas w obu magazynów danych.Aplikacja musi być w stanie sprawdzić konflikt i uzyskania wystarczających informacji, aby włączyć konfliktu jest rozpoznawana.
Przechowywanie informacji w kontekście aplikacji.
Aplikacja przechowuje dane z informacji śledzenia zmian.Informacja ta będzie dostępna wraz z innych zmian informacji podczas zmiany zostały uzyskane z lokalnej bazy danych.Typowy przykład to informacji kontekstowych jest identyfikatorem magazynu danych, który był źródło zmiany.
Do wykonywania poprzedniej operacji, aplikacja synchronizacji można używać następujących funkcji:
CHANGETABLE(VERSION…)
Po wprowadzeniu zmian aplikacji go sprawdzić konflikty za pomocą tej funkcja.Funkcja uzyskuje najnowszych informacji dla określonego wiersza w tabela prześledzone zmiany śledzenia zmian.Śledzenie zmian zawiera wersja wiersz, który był ostatnio zmieniany.Informacja ta umożliwia aplikacji ustalić, czy wiersz został zmieniony po ostatnim czas zsynchronizowane aplikacji.
Z CHANGE_TRACKING_CONTEXT
Aplikację można używać do przechowywania danych w kontekście niniejszej klauzula.
Sprawdzania konfliktów
W scenariuszu synchronizacja dwukierunkowa aplikacji klient należy ustalić, czy wiersz nie została zaktualizowana od aplikacji ostatnio uzyskane zmiany.
Poniższy przykład pokazuje sposób użycia funkcja CHANGETABLE(VERSION …), aby sprawdzić konflikty w sposób najbardziej efektywny, bez odrębnej kwerendy.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 wiersza jest większy niż wartość @last_sync_version, istnieje konflikt.Jeśli występuje konflikt, wiersz nie zostaną zaktualizowane.ISNULL() Wyboru jest wymagane, ponieważ może to być nie Zmień informacje dostępne dla wiersza.Brak informacji o zmianie czy istnieje wiersz nie miał zaktualizowane od czasu włączenia śledzenia zmian lub ponieważ został oczyszczony Zmień informacje.
-- 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)
Poniższy kod można sprawdzić 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 kontekstu
Za pomocą klauzula Z CHANGE_TRACKING_CONTEXT, aplikacja może przechowywać informacje kontekstu wraz z Zmień informacje.Te informacje można następnie uzyskać z SYS_CHANGE_CONTEXT kolumna, który jest zwracany przez CHANGETABLE(CHANGES …).
Informacje kontekstu jest zazwyczaj używane do identyfikowania źródło zmiany.Jeżeli można zidentyfikować źródło zmiany, informacje można 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 spójnego i poprawne wyniki
Aplikacji należy uwzględnić w procesie oczyszczania sprawdza, wartość @ last_sync_version.Jest tak, ponieważ danych mogła zostać usunięta po CHANGE_TRACKING_MIN_VALID_VERSION() została wywołana, ale przed aktualizacji.
![]() |
---|
Zaleca się używać migawka izolacji i wprowadzić zmiany w obrębie 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
Ostrzeżenie
Istnieje możliwość, że wiersz aktualizowany w obrębie transakcji migawka może zostały zaktualizowane w inna transakcja po transakcji migawka została uruchomiona.W takim przypadek konflikt aktualizacji izolacji migawka wystąpić i prowadzić do transakcji, zostanie rozwiązana.Jeśli tak się stanie, próbę aktualizacji.Następnie doprowadzi do zmian wykrycia konfliktów i wiersze nie są zmieniane.
Zobacz także