Gestione lock tabelle SQL Sever 2008 R2

martedì 08 marzo 2011 - 23.10
Tag Elenco Tags  SQL Server 2008 R2

ReRosso Profilo | Junior Member

Ciao ragazzi....

Volevo un'informazione da voi. Se ho una stored che esegue l'aggiornamento di una tabella (tempo di esecuzione oltre un minuto), il SQL Server gestisce da solo il lock quindi lasciando "in sospeso" eventuali accessi ai dati da parte di altri client, oppure è necessario un intervento manuale? E se si come?

Grazie a tutti.

alx_81 Profilo | Guru

>Ciao ragazzi....
ciao

>Volevo un'informazione da voi. Se ho una stored che esegue l'aggiornamento
>di una tabella (tempo di esecuzione oltre un minuto),
è tanto.. hai cursori? Si possono evitare con operazioni set based?

>il SQL Server gestisce da solo il lock quindi lasciando "in sospeso"
>eventuali accessi ai dati da parte di altri client, oppure è
>necessario un intervento manuale? E se si come?
durante l'operazione di update l'accesso alla risorsa è esclusivo se altri processi tentano di cambiare la stessa risorsa, altrimenti è condiviso:

"Only one transaction can obtain an update (U) lock to a resource at a time. If a transaction modifies a resource, the update (U) lock is converted to an exclusive (X) lock. Otherwise, the lock is converted to a shared-mode lock."

Quindi significa che nessuno può cambiare la risorsa che è in modifica.

Poi vi è da considerare anche il livello di isolamento e cosa fanno gli altri "client". Inoltre c'è da capire cosa vuoi che facciano gli altri client, devono aspettare la fine? devono poter leggere indipendentemente dalla commit dell'update? devono vedere solo i record committati?
Infine il codice, perchè in base a come è stato scritto potrebbero esserci buchi non gestiti (soprattutto se usi i cursori).

>Grazie a tutti.
di nulla!
--
Alessandro Alpi | SQL Server MVP
MCP|MCITP|MCTS|MCT

http://www.alessandroalpi.net
http://blogs.dotnethell.it/suxstellino
http://mvp.support.microsoft.com/profile/Alessandro.Alpi

ReRosso Profilo | Junior Member

Alessandro, innanzitutto grazie per la celere risposta.

Comunque ti spiego rapidamente la situazione.
La tabella da aggiornare è un anagrafica con circa 500.000 record. La stored aggiorna periodicamente le informazioni anagrafiche andando ad operare grosso modo su tutte le voci (una volta a settimana). I client effettuano operazioni di lettura attraverso un web service.

Premesso che non uso cursori, ne ho esigenze particolari, la domanda è:

Nel momento in cui la stored aggiorna, cosa succede se il web service tenta di accedere in lettura? Viene sollevata un'eccezzione?

Grazie

alx_81 Profilo | Guru

>Premesso che non uso cursori, ne ho esigenze particolari, la
>domanda è:
ok non entro nel merito

>Nel momento in cui la stored aggiorna, cosa succede se il web
>service tenta di accedere in lettura? Viene sollevata un'eccezzione?
se cerca di accedere al record o ai record che intanto sono oggetto di modifica e l'isolation level è ReadCommitted (quello di default) il processo che legge aspetta che il record o l'elenco dei record siano modificati e che la modifica sia committata. Quindi attenzione se la commit la fai solo alla fine.. potresti in tal caso bloccare a tal punto di ottenere un timeout in lettura.

--
Alessandro Alpi | SQL Server MVP
MCP|MCITP|MCTS|MCT

http://www.alessandroalpi.net
http://blogs.dotnethell.it/suxstellino
http://mvp.support.microsoft.com/profile/Alessandro.Alpi

ReRosso Profilo | Junior Member

Quello che pensavo!
Grazie mille Alessandro.

alx_81 Profilo | Guru

>Quello che pensavo!
>Grazie mille Alessandro.
se ti è stato di aiuto accetta la risposta così chiudiamo il thread
--
Alessandro Alpi | SQL Server MVP
MCP|MCITP|MCTS|MCT

http://www.alessandroalpi.net
http://blogs.dotnethell.it/suxstellino
http://mvp.support.microsoft.com/profile/Alessandro.Alpi
Partecipa anche tu! Registrati!
Hai bisogno di aiuto ?
Perchè non ti registri subito?

Dopo esserti registrato potrai chiedere
aiuto sul nostro Forum oppure aiutare gli altri

Consulta le Stanze disponibili.

Registrati ora !
Copyright © dotNetHell.it 2002-2017
Running on Windows Server 2008 R2 Standard, SQL Server 2012 & ASP.NET 3.5