2011-09-04 14 views
10

Ho un file di dati e di tanto in tanto ho bisogno di scrivere una modifica al file. Il cambiamento consiste nel cambiare le informazioni in più di un posto. Ad esempio, cambiando alcuni dati vicino alla fine del file e anche cambiando alcune informazioni vicino all'inizio. Voglio che le due scritture separate abbiano esito positivo o negativo, altrimenti viene lasciato in uno stato incerto e corrotto in modo efficace. Esiste un supporto integrato per questo scenario in .NET o in generale?Scrittura di file transazionale in C# e Windows?

In caso contrario, come gli altri possono risolvere questo problema? In che modo un database su Windows risolve questo problema?

UPDATE: Non voglio utilizzare la funzionalità Transactional NTFS perché non è disponibile su una versione precedente di Windows come XP ed è lento nello scenario di sovrascrittura dei file come descritto sopra.

+1

Controllare questo collegamento: http://stackoverflow.com/questions/3267595/how-do-i-i-it-a-transacted-file-in-c – fatty

+0

Su quale file si sta per essere eseguito? – Oded

+0

Guardando Transactional NTFS si afferma che le prestazioni delle sovrascritture in un file sono molto lente. Questo è il mio scenario esatto e quindi sembra molto lento come approccio. Come fa un database a gestire la stessa situazione senza l'utilizzo di TxNTFS? –

risposta

4

Se si utilizza Windows 6 o successivo (Vista/7/2008/2008R2) il filesystem NTFS supporta le transazioni (anche all'interno di una transazione distribuita): ma è necessario utilizzare P/Invoke per chiamare le API Win32 (vedere questo question).

Se è necessario eseguire su versioni precedenti di Windows o partizioni non NTFS, è necessario eseguire le transazioni manualmente. Ciò è decisamente non banale: ottenere la piena funzionalità ACID durante la gestione di più processi (incluso l'accesso remoto tramite condivisioni) tra processi e arresti di sistema, anche con l'assunzione che verranno utilizzati solo i metodi di accesso (alcuni altri processi utilizzando le normali API Win32 sarebbero ovviamente rompere le cose).

In questo caso, un database sarà quasi certamente più semplice: ci sono un certo numero di database in-process (SQL Compact Edition, SQL Lite, ...) quindi un database non richiede un processo server.

+0

Vale la pena notare che Microsoft sta prendendo in considerazione [deprecating TxF] (http://stackoverflow.com/q/13420643/69809) nelle future versioni di Windows. – Groo

3

DB utilizza fondamentalmente un concetto di diario (almeno quelli di cui sono a conoscenza). Un'idea è che un'operazione di scrittura sia scritta nel journal fino a quando Writer non esegue il commit di una transazione. (Certo è descrizione solo di base, è così facile)

Nel tuo caso, potrebbe essere una copia del file, dove stai andando a scrivere un dato, e se tutto rifinito con successo, file originale sostituto con la sua copia.

Sostituzione: rinominare il file originale come old, rinominare il file di backup come original.

Se la sostituzione non riesce: si tratta di un errore critico, che l'applicazione deve gestire tramite strategie di tolleranza agli errori. Potrebbe essere che ha informato un utente di un'operazione di salvataggio fallita e tenta di recuperare. Tra l'altro in qualsiasi momento hai entrambe le copie del tuo file. Quella in cui l'operazione di scrittura è appena iniziata e quella in cui l'operazione di scrittura è terminata.

Queste tecniche sono state utilizzate su progetti passati su sistemi VS IDE per il controllo industriale con un discreto successo.

+0

Piuttosto interessante, potresti voler dare un po 'di più questa risposta. Ad esempio, c'è qualche cosa particolare a cui prestare attenzione? – Pacerier

+0

Ho trovato un articolo correlato: https://dutherenverseauborddelatable.wordpress.com/2014/02/05/is-my-data-on-the-disk-safety-properties-of-os-file-writeatomic/ – Pacerier