Transaktionsfilskrivning i C # og Windows?

Indlæg af Hanne Mølgaard Plasc

Problem



Jeg har en datafil og fra tid til anden skal jeg skrive en ændring til filen. Ændringen består i at ændre information på mere end ét sted. For eksempel ændrer du nogle data nær slutningen af ​​filen og ændrer også nogle oplysninger i nærheden af ​​starten. Jeg vil have de to separate skriver til enten at lykkes eller begge fejler, ellers er det tilbage i usikker tilstand og effektivt ødelagt. Er der nogen indbygget support til dette scenario i .NET eller generelt?


Hvis ikke så hvordan løser andre dette problem? Hvordan løser en database på Windows dette problem?


UPDATE : Jeg vil ikke bruge den Transaktionelle NTFS-kapacitet, fordi den ikke er tilgængelig på ældre version af Windows, såsom XP, og det er langsomt i filoverskrivningsscenariet som beskrevet ovenfor.

Bedste reference


Hvis du bruger Windows 6 eller nyere (Vista/7/2008/2008R2) understøtter NTFS-filsystemet transaktioner (inklusive inden for en distribueret transaktion): Du skal bruge P/Invoke til at ringe til Win32 API'er (se dette spørgsmål). [[


Hvis du skal køre på ældre versioner af Windows eller ikke-NTFS-partitioner, skal du selv udføre transaktionerne. Dette er bestemt ikke-trivielt: at få fuld ACID-funktionalitet, mens du håndterer flere processer (herunder fjernadgang via aktier) på tværs af proces og system nedbrud, selvom antagelsen om, at kun dine adgangsmetoder vil blive brugt (en anden proces ved hjælp af normale Win32 API'er ville naturligvis bryde ting).


I dette tilfælde vil en database næsten helt sikkert være lettere: Der er en række databaser i databasen (SQL Compact Edition, SQL Lite, ...), så en database kræver ikke en serverproces.

Andre referencer 1


DB bruger i princippet et Journal-koncept (i det mindste det jeg er opmærksom på). En ide er, at en skriveoperation er skrevet i tidsskriftet indtil Writer ikke begår en transaktion. (Sure det er bare grundlæggende beskrivelse, det er så nemt)


I dit tilfælde kan det være en kopi af din fil, hvor du skal skrive en data, og hvis alt er færdigt med succes , erstat originale fil med dens kopi.


Udskiftning er: omdøb den oprindelige fil som en old, omdøb backupfilen som en original.


Hvis substitution mislykkes: Dette er en kritisk fejl, at applikationen skal håndtere via fejltolerance strategier. Det kunne være, at det informerede en bruger om en mislykket gemmeoperation, og forsøger at genoprette. Forresten i hvert øjeblik har du begge kopier af din fil. Den ene, når skriveoperationen er lige startet, og den ene, når skriveoperationen er færdig.


Disse teknikker vi brugte på tidligere projekter på VS IDE som systemer til industriel kontrol med temmelig god succes.