none
SQL Server Merge Replication: výsledek příkazu SELECT nezahrnuje všechna data

    Dotaz

  • Příkaz SELECT spuštěný na klientovi merge replikace v okamžiku, kdy probíhá synchronizace, neobsahuje všechny záznamy, které jsou v tabulce prokazatelně uloženy. Select vybírá data podle primárního klíče, celkem max. 50 řádků. Chybí vždy nejstarší záznamy, pravděpodobně ty, které jsou právě zpracovávány procesem replikace. Ani Subscriber, ani Publisher neobsahuje chyby ani v SQL logu, ani v system logu, ani v replikačním logu. Veškerá data jsou replikována bez chyb. Četnost výskytu je 1-2 z 20000 operací denně.

    Merge replication, cca 60 tabulek, velikost databáze 40Gbyte. 100 Internet klientů, 30 LAN klientů (VPN). Synchronizace prováděna pomocí příkazu replmerg.exe

    Publisher: SQL Server 2005 Standards SP2 64Bit

    Subscriber: SQL Server Express Edition SP2. Častější výskyt chyby je u klientů připojených pomocí LAN.

    Zkoušel jsem měnit ISOLATION LEVEL, zkoušel jsem doplňovat do příkazu SELECT klauzuli WITH(NOLOCK), bez výsledku.

    úterý 13. dubna 2010 20:24

Odpovědi

  • Dobrý den,

    chybějící záznamy ve výsledku SELECTu mohou být způsobeny vedlejším efektem nedokonalé izolace transakcí. Jedná se o vlastnost SQL Serveru, která byla zdokumentována až ve verzi 2008, nicméně existovala i ve verzích předchozích. Pro více informací se podívejte nahttp://msdn.microsoft.com/en-us/library/ms190805.aspx na odstavec "Missing and Double Reads Caused by Row Updates" a zkuste, jestli tento jev není příčinou Vašeho problému.

    Miloslav Peterka.

    čtvrtek 15. dubna 2010 20:06

Všechny reakce

  • Dobrý den,

    chybějící záznamy ve výsledku SELECTu mohou být způsobeny vedlejším efektem nedokonalé izolace transakcí. Jedná se o vlastnost SQL Serveru, která byla zdokumentována až ve verzi 2008, nicméně existovala i ve verzích předchozích. Pro více informací se podívejte nahttp://msdn.microsoft.com/en-us/library/ms190805.aspx na odstavec "Missing and Double Reads Caused by Row Updates" a zkuste, jestli tento jev není příčinou Vašeho problému.

    Miloslav Peterka.

    čtvrtek 15. dubna 2010 20:06
  • Dobrý den,

    děkuji za tip, ale problém se mi zatím vyřešit nepodařilo. U SELECTu jsem použil režim WITH(ROWLOCK,HOLDLOCK), který by měl podle informací v tématu problém vyřešit, ale bez výsledku. Jinak jsem navíc zjistil, že řádky, které nejsou zahrnuty ve výsledku SELECT příkazu, spadají pod jiné číslo generace (v tabulce MSmerge_genhistory) než záznamy, které zahrnuty jsou.

    Dále se výrazně zvýšila frekvence výskytu problému poté, co se nám podařilo razantně zvýšit výkon replikací (snížení časů replikací na desetinu) zkrácením expirace a vyřešením dalších technických problémů kolem.

    středa 21. dubna 2010 8:48
  • Dobry den,

    zkuste prosim svuj dotaz v anglictine dat do fora http://social.msdn.microsoft.com/Forums/en-US/sqlreplication/threads, ktere je zamerene primo na replikace. Tam se snad najde nekdo, kdo se s Vasim problemem jiz setkal a bude Vam schopen poradit.

    MP.

    středa 21. dubna 2010 11:15
  • Děkuji, právě jsem tak učinil :)
    středa 21. dubna 2010 11:19