pipponet ha scritto:
Evidentemente mi sono espresso male... ti assicuro di non essere cosi scarso Luca :-), almeno in teoria sui database ( ricordo di aver preso 30 e lode in questa materia... non mi rispondere che evidentemente ero raccomandato pero'... ;-) ),
...non dico questo, ci mancherebbe altro, però conosco il "livello" di alcuni esami universitari... ;-)
e questa è solo una minima parte di esso, pero' posso cmq dirti che a me della transazione che tra l'altro è nidificata con altre che fanno riferimento a connessioni di altri DB,
A che cosa ti serve nidificare delle transazioni? Sai che scrivere
==========================
BEGIN TRAN
istruzione1
BEGIN TRAN
istruzione2
BEGIN TRAN
istruzione3
COMMIT TRAN
COMMIT TRAN
istruzione4
COMMIT TRAN
==========================
equivale in tutto e per tutto a scrivere
==========================
BEGIN TRAN
istruzione1
istruzione2
istruzione3
istruzione4
COMMIT TRAN
==========================
ed oltretutto rende (molto) più leggibile il codice e contribuisce ad evitare errori di "dimenticare" transazioni aperte...
non puo' fare modifiche ma solo visualizzare, cioè non partiranno da essa operazioni che richiederanno blocchi esclusivi o di aggiornamento, quindi letture fantasma o anche il caso di lettura di dati non permanenti e che quindi potrebbero essere annullati da un rollback...
...qualcuno che fa modifiche ci deve pur essere, altrimenti i blocchi esclusivi chi li applica? Mi sembra uno dei problemi che riscontri è proprio quello di problemi legati a questo tipo di blocchi, no? Ovviamente mi riferisco NON alla tua applicazione ma al complesso delle attività che vengono svolte sul database eventualmente anche da altre applicazioni che a questo punto sono loro a causare problemi...
Quindi in questo caso usare il with no lock equivale ad usare il livello read uncommitted giusto?
...esatto... ma io indagherei su come fanno quei blocchi esclusivi ad essere presenti e soprattutto ad essere così invasivi...
mi sembra cosi non è e che forse non si puo' "forzare" sql server ad es. a fargli eseguire un blocco solo sui record da modificare e non sua una tabella ecc.
Quello che devi tenere a mente sono principalmente i fattori legati all'efficienza e i blocchi impliciti. Poichè ogni blocco che viene applicato richiede delle risorse al sistema, è molto più efficiente gestire un solo blocco a livello di pagina piuttosto che talvolta diverse centinaia (o migliaia) di blocchi a livello di riga. Inoltre non dimenticarti che anche un blocco a livello di riga comporta l'applicazione di un blocco sulle risorse che contengono la riga. Se blocco in maniera esclusiva un record risulteranno implicitamente bloccate anche la pagina e la tabella che lo contengono in quanto non sarà possibile per altre connessioni/transazioni acquisire un blocco esclusivo sulla pagina/tabella in cui risulta bloccato un solo record. SQL Server gestisce autonomamente (e bene) il "lock escalation" basandosi su criteri di efficienza la granularità del blocco da applicare. Nelle versioni precedenti di SQL Server era possibile configurare (con la sp_configure) la "soglia" in base alla quale scalare il blocco alla risorsa superiore ma questa opzione finiva con il penalizzare pesantemente chi utilizzava in maniera impropria (e inadeguata) i valori di default. Non ho mai visto una modifica "sensata" di questo parametro di configurazione (e di scenari ne ho visti abbastanza) per cui non posso che condividere la scelta fatta dai progettisti MS...
questo intendevo quando dicevo che mi iteressava approfondire ancora di piu' oltre al tuo buon articolo, perchè in quest'ultimo credo la cosa non sia trattata in modo approfondito, evidentemente perchè non era lo scopo dello stesso...
...trattare l'argomento in maniera esaustiva avrebbe richiesto non un articolo ma un libro come ha fatto Kalen Delaney (l'autrice di "Inside SQL Server 2000") che ha pubblicato recentemente "Hands-On SQL Server 2000 : Troubleshooting Locking and Blocking" di cui puoi visualizzare una scheda al link
http://www.shareit.com/product.html?cart=1&productid=183645&affiliateid=&languageid=1&cookies=1&backlink=http://www.netimpress.com/Default.asp?¤cies=USD
e ti assicuro che anche in questo libro ci sono alcuni argomenti che meriterebbero di essere approfonditi :-)
Quindi oltre alle correzioni delle cose dette sopra, ti chiedo di darmi qualche imput su quest'ultimo argomento, cioè se si puo' interferire manualemnte sulla quantità di record da bloccare, se ha senso farlo e quindi se conviene e se si in quali casi...
La scelta più saggia da fare è quella di lasciar gestire a SQL Server la granularità del blocco sia in considerazione del fatto che "SQL Server ne sa più di noi" e sia perchè la scelta "automatica" si rivela in grado di rispondere ad eventuali (sicure) mutate esigenze. Ritengo inevitabile che le dimensioni e la distribuzione dei dati nella tabella nonchè il tipo di attività che verranno eseguite possano alterare in maniera significativa quelle che oggi potrebbero essere delle ottime scelte implementative. Il più delle volte i problemi del genere sono dovuti non a "impropria" gestione dei lock (e del livello di isolamento delle transazioni) ma piuttosto da errori a livello applicativo. Non mi riferisco soltanto a transazioni lasciate aperte per errore ma soprattutto a transazioni che vengono aperte e durano più del dovuto in quanto si attende l'elaborazione di un risultato, un calcolo da parte del client o, peggio, un input dell'utente, che fanno in modo che per tutto questo tempo (fino a che l'elaborazione termina oppure fino a che l'utente decide di riempire una input box) la transazione rimanga inutilmente aperta. Per quanto possibile le elaborazioni, gli input dell'utente e quant'altro possa interferire con il database server andrebbe eseguito PRIMA di avviare la transazione in maniera tale da farla andare a "palla di cannone" e SENZA alcuna interazione (umana o del client) dal BEGIN TRAN al COMMIT o ROLLBACK. Purtroppo questo è un aspetto in cui vale poco disegnare in maniera tecnicamente ineccepibile una applicazione di accesso ai dati se sullo stesso db lavora già una applicazione che fa il proprio comodo in barba a tutte le norme di buona progettazione...
Ovviamente ti ringrazio per la tua gentilezza e pazienza....
Ciao
...oooppsss...
Mentre scrivevo non mi accorgevo delle dimensioni del messaggio, spero solo che Daniele non mi ammonisca per questo... :-))