Domanda

Sto scrivendo un codice di registrazione / auditing che sarà in esecuzione in produzione (non solo quando gli errori vengono gettati o durante lo sviluppo). Dopo aver letto Coding esperienze di horror con dead-bloccaggio e la registrazione , ho deciso che dovrebbe chiedere consiglio. (Soluzione di Jeff di "non logging" non funziona per me, questo controllo di sicurezza è obbligatorio per legge)

C'è un livello di isolamento adatto per ridurre al minimo contesa e di morti-bloccaggio? Eventuali suggerimenti di query che può aggiungere alla dichiarazione di inserimento o la stored procedure?

I profondamente a cuore l'integrità delle transazioni per tutto tranne la tabella di controllo. L'idea è che tanto sarà registrato che se alcune voci non riescono, non è un problema. Se la registrazione si ferma un qualche altro transaction-- che sarebbe male.

Posso entrare in un database o un file, anche se la registrazione in un file è meno attraente perché ho bisogno di essere in grado di visualizzare i risultati in qualche modo. Registrazione in un file sarebbe (quasi) garantire la registrazione non interferirebbe con altro codice però.

È stato utile?

Soluzione

Una transazione normale (es. READ COMMITTED) inserire già fa il bloccaggio 'minimal'. Introdurre applicazioni ad uso intensivo non stallo sull'inserto, non importa l'ordine di come l'inserto è mescolato con altre operazioni. Nel peggiore dei casi un sistema di inserimento intensiva può causare pagina contesa fermo sul punto caldo in cui si verifica inserto, ma non deadlock.

Per causare situazioni di stallo come descritto da Jeff ci deve essere più in gioco, come uno qualsiasi dei seguenti:

  • Il sistema utilizza un livello di isolamento più elevato (avevano arrivare poi e ben lo merita)
  • Leggevano dalla tabella del registro durante la transazione
  • (in modo da non piu 'append-only' è)
  • La catena deadlock serrature livello applicativo coinvolti (bilancio lock es. Net nell'ambito log4net) conseguente deadlock non rilevabili (es. Applicazione si blocca). Dato che la soluzione del problema coinvolto guardando processo di discariche, credo che questo è lo scenario che stavano avendo.

Quindi, fintanto che non inserisce solo accedendo transazioni livello di isolamento Read Committed siete al sicuro. Se ci si aspetta lo stesso problema che ho il sospetto che così aveva (es. Situazioni di stallo che coinvolgono serrature livello di applicazione), allora nessuna quantità di magia database può risparmiare, come il problema può ancora manifestarsi anche se si accede transazione separata o in connessione separata.

Altri suggerimenti

Se non si preoccupano di coerenza sulla tabella di registrazione, perché non eseguire tutte la registrazione da un thread separato .

Probabilmente non aspettare che le operazioni da completare prima della registrazione, dal momento che il registro può essere fondamentale nella diagnosi di transazioni esecuzione prolungata. Inoltre, questo consente di vedere tutto il lavoro di una transazione che ha fatto il rollback.

Afferra la traccia dello stack e tutti i dati di registrazione nel thread di registrazione, chuck E su una coda quando ci sono nuovi messaggi di registrazione, li a filo con il db in una singola transazione.

Passi per bloccaggio minimizzando:

  • (KEY) eseguire tutte accoda al tabella di registrazione esterno del filo principale / connessione / transazione.
  • Assicurarsi che la tabella di registrazione ha un indice cluster monotona crescente (es. Int identità) che sta aumentando ogni volta che si aggiunge un messaggio di log. In questo modo le pagine che sono inseriti nelle sono di solito in memoria ed evita le prestazioni colpisce che si ottiene con le tabelle heap.
  • eseguire più accoda al registro in una transazione (10 inserti in una transazione sono più veloci di 10 inserti di una transazione e di solito acquisire / rilasciare meno serrature)
  • Dategli una pausa. Eseguire solo accedendo al vostro db ogni N millisecondi. Batch up pezzi di opere.
  • Se avete bisogno di riferire su cose storicamente, si può considerare il partizionamento del tavolo di registrazione. Esempio: si potrebbe creare una nuova tabella di registrazione ogni mese, e allo stesso tempo avere una visione di registro che è un'UNION ALL di tutte le tabelle di registrazione più anziani. Eseguire la segnalazione contro la fonte più appropriata.

Si otterrà la migliore prestazione da vampate di calore più messaggi di registrazione in una singola transazione (piuttosto piccolo), e hanno il vantaggio che se 10 thread stanno facendo roba di lavoro e la registrazione, solo un singolo thread è vampate di calore roba alla tabella di registrazione. Questo pipelining rende effettivamente scala roba migliore.

Dal momento che non si preoccupano della integrità delle transazioni della tabella di controllo, ovviamente è possibile eseguire la registrazione al di fuori della transazione (vale a dire dopo aver completato). Che minimizzare l'impatto sulla transazione.

Inoltre, se si vuole ridurre al minimo di chiusura, si dovrebbe cercare di assicurare che, come gran parte del vostro carico di lavoro di query più possibile è che copre indici non cluster. (SQL Server 2005 e, soprattutto, l'uso della dichiarazione INCLUDE in indici NC può fare una grande differenza)

Un modo semplice per evitare che la registrazione di avere problemi di blocco con il database 'normale' è di non usare lo stesso database. Basta creare un altro database per la vostra registrazione. Come bonus, la rapida crescita del database di registrazione non comporterà una frammentazione nel vostro DB principale. Personall, io di solito preferisco per accedere a un file - ma poi di nuovo, io sono abituato a fare la manipolazione del testo pesante nel mio editor - VIM. Accesso ad un DB separata dovrebbe contribuire ad evitare problemi di blocco critico.

Basta fare in modo che se provate a scrivere il proprio appender database per il quadro di registrazione utilizzato, è essere molto attenti alle serrature (che sto cercando di indovinare che cosa è sgambetto Jeff nel post del blog si fa riferimento). Scritto correttamente (vedi alcuni dei commenti nel post di Jeff), non dovreste avere problemi di blocco con il quadro di registrazione a meno che non fanno qualcosa di dispari .

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