Come aggiornare tantissimi record su una tabella del db della Microsoft senza effettuare un lock alla stessa?
Potremmo semplicemente usare l’istruzione
SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED
ma rischieremmo di creare disallineamenti vari a causa della lettura “al volo” dovuta all’istruzione sopra citata.
La soluzione quindi è aggiornare un po’ di record alla volta, così come segue:
set ROWCOUNT 100 update TABELLA_PROVA with(UPDLOCK) set FL_AGG = 1, CAMPO1 = CAMPO2 + CAMPO3 where FL_AGG = 0 set ROWCOUNT 0
Analizziamo ogni passaggio linea per linea:
- imposta le istruzioni ad eseguire le operazioni su 100 record al massimo (quindi aggiornerà solo 100 record)
- aggiorna la tabella effettuando il lock solo sui record da aggiornare (100)
- per i record che non sono ancora aggiornati, è necessario definire un campo che controlli quali sono aggiornati e quali no, altrimenti si rischia di aggiornare sempre gli stessi
- riporta l’impostazione sul numero dei record allo stato normale
Non resta che eseguire quest’istruzione per un numero di volte pari ai record da aggiornare diviso 100. Come? Non avete voglia di eseguire l’istruzione a mano centinaia di volte? Ok…
Per eseguire automaticamente l’istruzione il numero giusto di volte è necessario fare un caro e vecchio ciclo, come segue.
`declare @i int
select @i = count(1)
from TABELLA_PROVA WITH(NOLOCK)
where FL_AGG = 0
while (@i>0) begin
set ROWCOUNT 100
update TABELLA_PROVA with(UPDLOCK)
set FL_AGG = 1,
CAMPO1 = CAMPO2 + CAMPO3
where FL_AGG = 0
set ROWCOUNT 0
select @i = count(1)
from TABELLA_PROVA WITH(NOLOCK)
where FL_AGG = 0` `end`
Molto brevemente:
- istanzio la variabile che mi serve per il controllo
- inserisco nella variabile il conteggio dei record che devo aggiornare (usando with(NOLOCK) per non creare lock sulla tabella)
- aggiorno 100 record tra quelli che devo aggiornare, è necessario avere un campo che faccia da discriminante e consiglio vivamente la with(UPDLOCK)****
- riconto i record da aggiornare, il ciclo while permette di fare il ciclo controllando ogni volta il valore della variabile di controllo
A questo punto possiamo dimenticarci le nostre attività di data-entry e dire BUON LAVORO (al pc!).