webForumDet fria alternativet

låsa hela applikationen eller databasen

.NET

5 svar · 352 visningar · startad av Nöff

Medlem sedan nov. 2003569 inlägg
Frågan#1

Hejje.

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.

Medlem sedan juli 200012 978 inlägg
#2

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.

Medlem sedan nov. 2003569 inlägg
#3

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?

Medlem sedan dec. 19996 522 inlägg
#4

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

Medlem sedan nov. 2003569 inlägg
#5

SELECT TOP 1 * FROM tabellen WITH (TABLOCKX) :h

Men det verkar som den fortfarande måste vara inom en transaction för att funka.. kom gärna med tips om hur man lockar en tabell utan transactions.

Medlem sedan nov. 2003569 inlägg
#6

Eller.... nu är det sent... *host host* ..

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
130 ms — deklarationer (db)
0 ms — hämta statistik (cache)
134 ms — hämta tråd, inlägg och bilagor (db)
134 ms — ändringar (db)