144 messaggi dal 02 aprile 2003
salve ragazzi non riesco a risolvere un problema che mi sta snervando:
io ho diverse transazoni contemporaneamnete che scrivono contemporaneamente sulle stesse tabelle ma su record diversi.Studando un po di sqlserver ho capito che una scrittura su una tabella blocca tutte le altre scritture sulla stessa tabella, perchè il blocco avviene al livello di tabella e non al livello di singolo record.
Esiste quindi un modo per permettere la scrittura contemporanea verso la stessa tabella ma su dati diversi senza che le transazioni vengano eseguite una alla volta??
1.024 messaggi dal 19 dicembre 2003
Contributi | Blog
La risposta sarebbe abbastanza articolata per poterla esaurire in un post e come al solito c'è una risposta breve ed una più completa.
La risposta breve è che il lock non avviene (solo) a livello di tabella; ogni lock non va mai da solo e se apporti una modifica ad una sola riga viene posto un blocco esclusivo sulla riga oggetto di modifica ed una serie di lock sugli oggetti di livello superiore, vale a dire sulla pagina dati in cui è contenuta, sulla partizione se esiste, sulla tabella e, se coinvolte, sulle strutture di indice.
La risposta un po più articolata è che SQL Server gestisce autonomamente i lock e prende decisioni in merito al tipo ed escalation di lock sulla base di quello che ritiene più efficiente. Se sono oggetto di modifica diverse righe potrebbe essere più efficiente gestire pochi blocchi di pagina (fermi restando i blocchi "superiori") piuttosto che parecchie decine o centinaia di blocchi di riga o, addirittura, ancora meglio un unico blocco su tutta la tabella. Si può intervenire sul comportamento di SQL Server utilizzando degli hint o modificando il livello di isolamento, ma si tratta di azioni da intraprendere con il contagocce e in maniera mirata perchè il database server (qui non mi riferisco solo a SQL Server ma ad ogni dbms) è in grado di compiere, autonomamente, le scelte migliori.
Per quella che è la mia esperienza ti posso riportare che il più delle volte ("il più delle volte" si tratta di qualcosa di superiore al 99,99%) i problemi di concorrenza risiedono nell'applicazione o nell'architettura implementata.
Solo a titolo di esempio, tra l'inizio e il termine della transazione non devono esserci possibilità di input, elaborazioni, validazioni dei dati che farebbero in modo di dilatare i tempi altrimenti brevi dell'istruzione DML oggetto di transazione. Dal lato architetturale la commistione di attività OLTP e di supporto decisionale hanno requisiti diversi fra loro ed incompatibili le une con le altre.
Come accennato all'inizio l'argomento sarebbe molto vasto se si volesse affrontare ad un livello adeguato, ma giusto per mettere una fine (e tornare in topic) in genere una decina di utenti che interagiscono simultaneamente sugli stessi record non rappresentano mai un problema se opero in modalità "begin tran - istr1 - istr2 - istr3 - commit".

Bye

Torna al forum | Feed RSS

ASPItalia.com non è responsabile per il contenuto dei messaggi presenti su questo servizio, non avendo nessun controllo sui messaggi postati nei propri forum, che rappresentano l'espressione del pensiero degli autori.