Errore 1205 durante la configurazione della replica transazionale

Questo articolo consente di risolvere un problema che si verifica quando si configura la replica transazionale in SQL Server.

Versione originale del prodotto: SQL Server
Numero KB originale: 2674882

Sintomi

Considerare lo scenario descritto di seguito:

  • È possibile configurare la replica transazionale in SQL Server.
  • La topologia di replica transazionale è costituita da diversi server di pubblicazione.
  • I server di pubblicazione replicano i dati nello stesso database sottoscrittore.
  • Gli agenti di distribuzione vengono eseguiti in modo continuo o eseguiti in base a una pianificazione frequente. Ad esempio, gli agenti di distribuzione vengono eseguiti ogni minuto.

In questo scenario, gli agenti di distribuzione possono essere coinvolti in uno scenario deadlock e possono essere selezionati come vittima di deadlock. Quando si verifica questo problema, è possibile che venga visualizzato un messaggio di errore simile al seguente:

Errore 1205
La transazione (ID processo %d) è stata bloccata nelle risorse %.*ls con un altro processo ed è stata scelta come vittima del deadlock. Ripetere la transazione.

Se si abilita il flag di traccia 1222 per reindirizzare le informazioni sui deadlock nel log degli errori SQL Server, viene visualizzato un messaggio di errore simile a uno dei seguenti:

  • update MSreplication_subscriptions set transaction_timestamp = cast(@P1 as binary(15)) + cast(case datalength(transaction_timestamp) when 16 then isnull(substring(transaction_timestamp, 16, 1), 0) else 0 end as binary(1)), "time" = @P2 where UPPER(publisher) = UPPER(@P3) and publisher_db = @P4 and publication = @P5 and subscription_type = 0

  • update MSreplication_subscriptions set transaction_timestamp = cast(@P1 as binary(15)) + cast(substring(transaction_timestamp, 16, 1) come binary(1)), "time" = @P2 where UPPER(publisher) = UPPER(@P3) e publisher_db = @P4 e publication = @P5 e subscription_type = 0 e (sottostringa(transaction_timestamp, 16, 1) = 0 o datalength(transaction_timestamp) < 16)

Causa

Questo problema si verifica se la stima rowcount per la tabella di sistema numerica MSreplication_subscriptions non è corretta. Se la stima rowcount non è corretta, il motore di database SQL Server potrebbe usare un metodo non corretto per aggiornare il database.

Nota

In genere, la stima rowcount corretta è uguale al numero di sottoscrizioni nel database. Se si usa la funzionalità Flussi di sottoscrizione, la stima rowcount è uguale al numero di sottoscrizioni moltiplicate per il numero di flussi configurati per ogni sottoscrizione.

Risoluzione

Per risolvere questo problema, utilizzare uno dei seguenti metodi.

  • Metodo 1: usare il DBCC UPDATEUSAGE comando .

    Per risolvere questo problema, aggiornare il valore rowcount non corretto. A tale scopo, utilizzare il seguente comando:

    DBCC UPDATEUSAGE (**subscriber_database_name** **,**'MSreplication_subscriptions') WITH COUNT_ROWS
    

    Nota

    Il DBCC UPDATEUSAGE comando determina i valori corretti per le righe, le pagine usate, le pagine riservate, le pagine foglia e i conteggi delle pagine dati per ogni partizione di una tabella. Se questi valori sono corretti, il DBCC UPDATEUSAGE comando non restituisce dati. Se vengono trovati e corretti valori imprecisi, DBCC UPDATEUSAGE restituisce le righe e le colonne aggiornate.

  • Metodo 2: usare l'istruzione ALTER INDEX .

    Per risolvere questo problema, ricompilare gli indici associati alla MSreplication_subscriptions tabella. A tale scopo, usare l'istruzione seguente:

    ALTER INDEX ALL ON [dbo].[MSreplication_subscriptions] REBUILD
    

Ulteriori informazioni

Quando si verifica il problema menzionato nella sezione Sintomi , la stima del conteggio delle righe per la MSreplication_subscriptions tabella di sistema può essere pari a 4.294.967.296. Per controllare il valore rowcount, usare uno dei metodi seguenti.

  • Metodo 1: usare SQL Server Management Studio.

    Per usare SQL Server Management Studio per controllare il valore rowcount per la tabella di MSreplication_subscriptions sistema, seguire questa procedura:

    1. Avviare SQL Server Management Studio e quindi connettersi all'istanza del server sottoscrittore.
    2. Espandere Database e quindi espandere il database del Sottoscrittore.
    3. Espandere Tabelle e quindi Tabelle di sistema.
    4. Fare clic con il pulsante destro del mouse su dbo. MSreplication_subscriptions e quindi selezionare Proprietà.
    5. Selezionare Archiviazione e quindi verificare il valore rowcount nel campo Conteggio righe .
  • Metodo 2: usare un'istruzione di query.

    Per controllare il valore rowcount per la tabella di MSreplication_subscriptions sistema, eseguire la query seguente:

    SELECT rows, * FROM sys.partitions WHERE object_id = object_id('MSreplication_subscriptions')
    

Riferimenti