Domanda

Vorrei porre un paio di domande riguardanti il ​​meccanismo di blocco di SQL Server

  1. Se non utilizzo l'hint di blocco con l'istruzione SQL, SQL Server utilizza l'hint PAGELOCK per impostazione predefinita.ho ragione???Se sì, allora perché?potrebbe essere dovuto al fatto di gestire troppe serrature, questa è l'unica cosa che ho preso come inconveniente, ma per favore fatemi sapere se ce ne sono altri.e dimmi anche se possiamo modificare questo comportamento predefinito se è ragionevole farlo.

  2. Sto scrivendo un'applicazione lato server, un server di sincronizzazione (non utilizzando il framework di sincronizzazione) e ho scritto query di database nel file di codice C# e utilizzo la connessione ODBC per eseguirle.Ora la domanda è: qual è il modo migliore per modificare il blocco predefinito da Pagina a Riga tenendo presente gli inconvenienti (ad es.aggiungendo un suggerimento di blocco nelle query questo è ciò che sto pianificando).

  3. Cosa succede se una query SQL (SELECT/DML) viene eseguita senza l'ambito della transazione e l'istruzione contiene un suggerimento di blocco, quale tipo di blocco verrà acquisito (ad es.condiviso, aggiornamento, esclusivo)?E mentre si trova nell'ambito della transazione, il livello di isolamento della transazione ha un impatto sul tipo di blocco se viene utilizzato l'hint ROWLOCK.

  4. Infine, se qualcuno potesse darmi un campione in modo da poter testare e sperimentare personalmente tutti gli scenari sopra indicati (ad es.codice punto net o script sql)

Grazie Mubashar

È stato utile?

Soluzione

  1. NO.Si blocca come ritiene opportuno e intensifica i blocchi secondo necessità

  2. Lascia che sia il motore DB a gestirlo

  3. Vedi punto 2

  4. Vedi punto 2

Utilizzerei i suggerimenti di blocco solo se desideri comportamenti specifici e determinati, ad es code o letture non bloccanti (sporche).

Più in generale, perché ritieni che il motore DB non possa fare ciò che desideri per impostazione predefinita?

Altri suggerimenti

Il blocco predefinito è il blocco delle righe e non quello della pagina, anche se il modo in cui funziona il meccanismo di blocco implica che verranno posizionati dei blocchi su tutti gli oggetti all'interno della gerarchia, ad es.leggere una singola riga posizionerà un blocco condiviso sulla tabella, un blocco condiviso sulla pagina e quindi un blocco condiviso sulla riga.

Ciò consente a un'azione che richiede un blocco esclusivo sulla tabella di sapere che potrebbe non accettarlo ancora, poiché è presente un blocco condiviso (altrimenti dovrebbe controllare la presenza di blocchi in ogni pagina/riga).

Se emetti troppi blocchi per una singola query, tuttavia, esegue l'escalation dei blocchi che riduce la granularità del blocco, in modo da gestire meno blocchi.Questo può essere disattivato utilizzando un flag di traccia ma non lo prenderei in considerazione.

Fino a quando non sai di avere effettivamente un problema di blocco/escalation del blocco, rischi di ottimizzare prematuramente un problema inesistente.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top