Condividi tramite


Log delle transazioni write-ahead

In questo argomento viene descritto il ruolo del log delle transazioni write-ahead nella registrazione nel disco delle modifiche dei dati. Per informazioni di base sui log delle transazioni, vedere Panoramica del log delle transazioni.

In SQL Server viene utilizzato un log write-ahead (WAL) che garantisce che le modifiche apportate ai dati non vengano scritte nel disco prima del record di log corrispondente. In questo modo, è possibile mantenere le proprietà ACID per una transazione. Per ulteriori informazioni sulle transazioni e le proprietà ACID, vedere Transazioni (Motore di database).

Per comprendere il funzionamento del log write-ahead, è importante sapere come vengono scritti su disco i dati modificati. SQL Server mantiene una cache buffer da cui legge le pagine dei dati quando è necessario recuperare i dati. Le modifiche dei dati non vengono eseguite direttamente nel disco, bensì nella copia della pagina archiviata nella cache buffer. La modifica viene scritta nel disco solo dopo l'esecuzione di un checkpoint nel database o se la scrittura nel disco è necessaria per consentire di inserire una nuova pagina nel buffer. La scrittura di una pagina di dati modificata dalla cache buffer al disco viene definita scaricamento della pagina. Una pagina modificata nella cache, ma non ancora scritta nel disco viene definita pagina dirty.

Quando viene apportata una modifica a una pagina nel buffer, nella cache del log viene compilato un record di log in cui viene registrata la modifica. Tale record di log deve essere scritto nel disco prima che venga eseguito lo scaricamento della pagina dirty corrispondente dalla cache buffer al disco. Se la pagina dirty viene scaricata prima che il record di log venga scritto, crea una modifica nel disco di cui non sarà possibile eseguire il rollback nel caso in cui si verifichi un errore del server prima che il record di log venga scritto nel disco. SQL Server include una logica che impedisce che una pagina dirty venga scaricata prima della scrittura del relativo record di log. I record di log vengono scritti su disco dopo che è stato eseguito il commit delle transazioni.

Nota

Alcune unità IDE SATA memorizzano nella memoria interna le scritture di dati, prima che questi vengano scritti su disco. Ciò impedisce il funzionamento corretto del log write-ahead. Se il computer che sta eseguendo SQL Server utilizza uno di questi tipi di dischi, è necessario abilitare l'opzione enable_force_flush.