Effettivamente sono stato un po' rapido nella risposta.
Diciamo che se in linea di massima hai un problema di concorrenze, ti conviene usare gli strumenti che mamma Microsoft ti mette a disposizione in ADO.Net ovvero il DataSet e l'SQLDataAdapter. In quel caso, Apri una SqlTransaction Serializzata (puoi usare anche una connessione differente per ogni transazione non cambia niente gestisce tutto SQL Server) e fai il fill di un dataset framite il tuo oggetto SqlDataAdapter. A questo punto il livello di isolamento impostato non ti permette di eseguire alcunchè a livello di database sui dati che hai letto nel Dataset fin tanto che la transazione non viene chiusa tramite commit o rollback(Quindi attento ad usare la Serializable). In questo caso l'UPDLOCK è chiaramente inutile, le altre transazioni in ingresso verranno accodate.
Se invece vuoi bloccare a mano una tabella, allora non usare il livello di Isolamento Serializable ma usa correttamente l'istruzione UPDLOCK con il livello di isolamento Chaos o meglio ancora Unspecified, ma stai molto attento a bloccare solo quello che ti serve, altrimenti rischi di bloccare tutto o fare degradare le prestazioni di accesso ai dati dell'applicazione.
Se i blocchi che imposti sono troppo blandi puoi invece incappare in letture fantasma.
Ricapitolando, se imposti un livello di isolamento per la transazione, i LOCK vengono automaticamente gestiti da ADO in funzione del livello di isolamento stesso:
Chaos: Le modifiche in sospeso dalle transazioni più isolate non possono essere sovrascritte.
ReadCommitted: La condivisione dei blocchi viene mantenuta durante la lettura dei dati per evitare letture "dirty", anche se è possibile modificare i dati prima del termine della transazione, con conseguente produzione di letture non ripetibili o dati fantasma.
ReadUncommitted: È possibile una lettura "dirty", ovvero non verrà emesso alcun blocco condiviso, né verrà rispettato alcun blocco esclusivo.
RepeatableRead :I blocchi vengono posizionati su tutti i dati utilizzati in una query, per impedire ad altri utenti di aggiornare i dati. Vengono impedite le letture non ripetibili, ma possono essere presenti righe fantasma.
Serializable
Viene posizionato un blocco di intervallo sull'oggetto DataSet, per impedire ad altri utenti di aggiornare o immettere righe nel dataset fino al termine della transazione.
Unspecified: Verrà utilizzato un livello di isolamento diverso da quello specificato, ma il livello non potrà essere determinato.
Spero di essere satao un po' più di aiuto rispetto al precedente post.
Ciao, Andrea