Jag har en databas med några miljoner poster i.
Tänkte dra ut en rapport baserat på alla dataabasens tabeller. Detta kan ta några minuter. Jag skulle vilja låsa databasen eller applikationen medans jag gör detta så ingen kan skriva till databasen medans jag gör detta. Finns det något annat sätt än transactions att göra detta på?. Eftersom det handlar bara om SELECT:s som ska göras.
Om du vill ha ett visst givet läge kanske du skall ta en kopia på db Då kan du köra flera select och vara säkert på att du använder samma grundmaterial.
Hmm. detta är tyvärr inte möjligt, eftersom rapporterna ska dras ut dagligen från en websida.
Jag har förresten upptäckt en grej med transactioner.
Tidigare trodde jag att låsningen startade här:
SqlCommand.Transaction=SqlCommand.Connection.BeginTransaction(IsolationLevel.Serializable);
Och gällde alla tabeller i hela databasen.
Men så var visst inte fallet, den börjar inte låsa förrän:
SqlCommand.ExecuteNonQuery()
Och den låser då enbart de tabeller som står i Command objectets CommandText, och SELECT låser ingenting, enbart DELETE,UPDATE,INSERT :l
Så då måste jag , om jag ska använda transactioner när jag ska göra rapporter gör nån fantom update på tabellerna eller nåt, alltså göra en update som inte finns.. för att få dem att låsa sig.
eller finns det nåt annat SQL statement som liksom "touchar" tabeller så att transactionen hugger till och låser dem?
Jag har för mig att du kan låsa de tabeller som är inblandade i selecten via själva frågan, utan transactions. I alla fall i sqlserver har jag för mig, något i en bok någonstanns. LarsG kan säkert svara på det i sql forumet
SELECT TOP 1 * FROM tabellen WITH (TABLOCKX)
lockar tabellen till statements:et är klart.
Man måste ju använda transactioner om man vill SELECT:a från flera tabeller samtidigt så att den behåller TABLOCKX på ALLA tabeller man lockar tills man är färdig med den sista tabellen.
271 ms totalt · 4 externa anrop · v20260731065814-full.a51de22e