Håller på med ett projekt där databas och filsystem behöver vara i sync. System kan deltaga i en distrubierad transaktion där en rad läggs till i en databas och en fil sparas på disk. Om något går galet i transaktionen skall ovannämnda ändringar ångras. Med själva databasen är det inga problem men att få filsystemet att ta bort filen har jag märkt vara mycket svårare. Vet att transaktioner för NTFS finns i Vista och kommer i Windows Server 2008, men nu råkar servern köra Windows Server 2003 och kan därför inte använda det metoden.
Någon som har ett förslag på en workaround? Kan man bygga en egen hanterare för transaktioner som lyssnar på om den går bra eller dåligt och därefter tar man bort filen?
1. Ladda upp filen.
2. Om filen laddas upp och sparas korrekt spara i databasen.
3a. Om sparandet i databasen lyckades KLART.
3b. Sparandet lyckas inte, ta bort filen.
Dock så undrar jag varför det inte går att lägga filen i databasen, vet att några från jobbet var i kontakt med Microsoft och diskuterade detta med att lägga filen i databas eller i ett fillagringssystem och då fick dom svaret databas, känner dock inte till alla detaljer.
Man skall tydligen kunna få ut en filestream ur en datareader.
Den del jag beskrev är bara en del av en mer övergripande transaktion som även pratar med andra system. Det kan alltså vara så att den del jag tidigare beskrev fungerade felfritt men en annan del av den övergripande transaktionen misslyckas, då måste allt ångras och då måste jag ta bort filen även om allt fungerade i deltransaktionen.
Har varit inne på att lägga filen i en databas i stället. Finns så mycket ryckten för vad som är bäst. Valde bort det först pga av eventuella skalbarhetsproblem. Men borde kunna komma åt det mest genom att skriva bra frågor som inte tar med image/binary-kolumner i onödan t.ex. Och separera filen från huvudtabellen.
Kommer nog antagligen byta till databaslagring pga av fördelarna med transaktioner, men har blivit en litet vendetta att lösa transaktioner med filer :)
Du råkar inte ha någon adress till mer information om detta? har sökt utan att hitta något riktigt bra. De problem jag kan tänka mig är eventuella onödiga roundtrips via nätverksinterfacen och just i hur större datamängder sparas i SQL Server. Problemet med nätverk (om det är något) borde väl gå att komma åt via Named Pipes eventuellt Shared Memory?
Givetvis så kommer du få en prestandahit om du lagrar informationen i databasen istället för mot filsystemet. Speciellt om du lagrar filen lokalt på datorn.
Däremot så får du andra fördelar som säkert väger upp nackdelen.
- Den viktigaste är ju att du faktiskt får din transaktion, vilket säkert överväger prestandahiten...
- Andra fördelar är att du får en backup på din fil, många företag tar backuper av sina databaser ofta, men inte av filsystemet, kanske så sällan som 1 gång i veckan oftas 1 gång om dagen, och har man inte redudanta diskar så kan man förlora rätt mycket data.
- Du får även fördelen att du kan replikera ut filerna med SQL Servern, säg att du helt plötsligt skall sätta upp en satellit någonstans för att öka hastigheten ute på något lokalt kontor. Då får du ju automatiskt med dig filen när du replikerar ut data till satellitdatabasne, vilket du inte hade fått om du sparat ner filen till disk, då hade du fått hantera det själv.
- En annan stor fördel är skalbarheten, du kan utan att tänka på det bara slänga på en extra server om det behövs, eftersom filen sparas i databasen så kan vilken server som helst nå den, hade du sparat filen direkt på servern, så hade det kunnat bli så att någora filer sparas på den ena servern och andra filer på den andra servern och då hade man fått synka dessa filer mellan serverna eller spara dem på nätverket.
Så även om du får en prestanda hit eftersom du måste ut på nätverket jmf med skriva lokalt så väger säker fördelarna över, eftersom du antagligen måste skriva till en nätverksdisk ändå för att kunna serva mer än en server. Om du är rädd att prestandan skall bli riktigt lidande, så kan du ju cacha filerna på servern. Så första gången du hämtar filen så hämtar du den från databasen spara ner den som en fil på hårdisken med idet som namnet, och när någon sedan skall ha tag i filen, så kollar du i mappen om en sådan fil finns, finns den inte så hämtar du den och skapar den, finns den så tar du den från disk.
Om du har många filer som skall accessas så kan du öka prestandan rejält med denna lilla cachen..