Domanda

Il mio web app utilizza ADO.NET contro SQL Server 2008. Database scrive accadere nei confronti di un database primario (editore), ma legge sono carico bilanciato tra il primario e un database secondario (abbonati). Usiamo built-in replica transazionale di SQL Server per mantenere la data di up-to-secondario. La maggior parte del tempo, la coppia di secondi di latenza non è un problema.

Comunque, io ho un caso in cui mi piacerebbe bloccare fino a quando la transazione è impegnata nel sito secondario. Blocco per alcuni secondi è OK, ma tornando una pagina stantia per l'utente non è. C'è un modo in ADO.NET o TSQL per specificare che voglio attendere il completamento della replica? O posso, da parte dell'editore, verificare lo stato della replica della transazione senza collegare manualmente al server secondario.

[modifica] Il 99,9% del tempo, i dati l'utente è "abbastanza fresco". Ma c'è una sola operazione che invalida esso. Non riesco a leggere dalla casa editrice ogni volta sulla remota possibilità che è diventato non valido. Se non riesco a risolvere questo problema in replica transazionale, si può suggerire un'architettura alternativa?

È stato utile?

Soluzione

Non esiste una soluzione per SQL Server, ma ecco come ho lavorato intorno ad esso in altri ambienti.

Con tre stringhe di connessione separati nella vostra applicazione, e scegliere quello giusto in base alle esigenze della query:

  • In tempo reale - Punti direttamente sul server di un master. Tutte le scritture vanno in questa stringa di connessione, e solo i più mission-critical legge andate qui.
  • quasi in tempo reale - Punti in un carico piscina equilibrato di abbonati. Non scrive vanno qui, legge solo. Utilizzato per la stragrande maggioranza dei OLTP legge.
  • ritardata segnalazione - Nel vostro ambiente in questo momento, sta andando a puntare alla stessa piscina con bilanciamento del carico di abbonati, ma lungo la strada si può utilizzare una tecnologia come la distribuzione dei log di avere un pool di server 8-24 ore dietro. Questi scala davvero bene, ma i dati di molto indietro. E 'fantastico per la segnalazione, la ricerca, la storia a lungo termine, e altre necessità non in tempo reale.

Se si progetta la vostra applicazione per utilizzare quei 3 stringhe di connessione dalla partenza, il ridimensionamento è molto più facile, soprattutto nel caso che stai vivendo.

Altri suggerimenti

Si sta descrivendo una situazione mirroring sincrono. La replica non può, per definizione, sostenere il vostro requisito. La replica deve attendere per una transazione di commettere prima di leggere dal registro e la consegna al distributore e da lì al sottoscrittore, il che significa che la replica, per definizione, ha una finestra di opportunità per i dati di essere fuori sync.

Se si dispone di un requisito un'operazione per leggere la copia authorithative dei dati, allora si dovrebbe fare che decission nel client e assicurarsi di leggere da parte dell'editore in quel caso.

Mentre è possibile, in threory, validare castrato una determinata operazione è stato distribuito al sottoscrittore o no, non si dovrebbe basare il vostro disegno su di esso. La replica transazionale non dà alcuna garanzia di latenza, in base alla progettazione, quindi non si può contare su una modalità di funzionamento 'giorno perfetto'.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top