Holy cow, hai un sacco di domande qui, heh.Ecco alcune risposte:
Quando si inserisce un record in questa tabella, blocca l'intera tabella?
Non predefinito, ma se si utilizza il suggerimento TABLOCK o se si eseguono determinati tipi di operazioni di caricamento di massa, quindi sì.
Quindi, se si stanno interrogando i dati dalla tabella, si bloccherà fino a quando l'inserimento non sarà completato (mi rendo conto che ci sono dei modi per aggirare questo problema, ma sto parlando per impostazione predefinita)?
Questo diventa un po 'più complicato. Se qualcuno sta provando a selezionare i dati da una pagina nella tabella che hai bloccato, allora sì, li blocchi. È possibile aggirare il problema con cose come l'hint NOLOCK su un'istruzione select o usando l'isolamento di snapshot Committed Read. Per un punto di partenza su come funzionano i livelli di isolamento, controlla Kendra Little's isolation levels poster.
Quanto tempo ci vorrà prima che causi un deadlock? Questo tempo dipenderà dalla quantità di carico presente sul server, ad es. se non c'è molto carico ci vorrà più tempo per causare un deadlock?
I deadlock non sono basati sul tempo: si basano sulle dipendenze. Dire che abbiamo avuto questa situazione:
- Query A è in possesso di un mazzo di serrature, e compiere la sua interrogazione, ha bisogno di roba che bloccato da query B
- Query B è anche in possesso di un mazzo di serrature, e per finire la sua interrogazione, ha bisogno di roba che bloccato da query a
Né query può andare avanti (si pensi situazione di stallo messicano) in modo SQL Server chiama un pareggio, spara interrogazione di qualcuno nella parte posteriore, rilascia i suoi riccioli, e lascia andare l'altra query. SQL Server seleziona la vittima in base alla quale sarà meno costoso eseguire il rollback. Se si vuole essere fantasiosi, è possibile utilizzare SET DEADLOCK_PRIORITY LOW su particolari query per dipingere i target sulla loro schiena e SQL Server li scatterà per primi.
C'è un modo per monitorare e vedere cosa è bloccato in un determinato momento?
Assolutamente - ci sono le viste di gestione dinamica (DMV) che puoi eseguire query come sys.dm_tran_locks, ma il modo più semplice è utilizzare Adam Machanic's free sp_WhoIsActive stored proc. E 'una sostituzione davvero chiazza di petrolio per sp_who che si può chiamare in questo modo:
sp_WhoIsActive @get_locks = 1
Per ogni query in esecuzione, si otterrà un po' di XML che descrive tutti i blocchi in suo possesso. C'è anche una colonna di blocco, quindi puoi vedere chi sta bloccando chi. Per interpretare i blocchi trattenuti, ti consigliamo di controllare lo Books Online descriptions of lock types.
Se ogni thread esegue query su singole tabelle, è possibile che si verifichi il blocco? Quindi non è il caso che un deadlock può verificarsi solo se hai una query che ha un join e agisce su più tabelle?
Che ci crediate o meno, a single query can actually deadlock itself e sì, le query possono bloccarsi su un solo tavolo. Per saperne di più su deadlock, controlla The Difficulty with Deadlocks by Jeremiah Peschka.
Lista di letture impressionante; Grazie! – dividius
Buona forma mio buon uomo .... – dotnetnewb