2015-07-22 29 views
8

Se apro un SqlConnection a un server SQL e quindi emetto più query da più thread in background, tutti utilizzando quella connessione, tali query verranno eseguite in modo sequenziale (non interessa l'ordine)?SqlConnection elabora le query in parallelo?

In particolare, se all'inizio di una query è possibile modificare il livello di isolamento e quindi ripristinarlo alla fine di tale query, esiste la possibilità che questo livello di isolamento si possa applicare ad altre query?

Penso di no, ma voglio confermare.

SQL Server 2008 R2

E sto parlando di System.Data.SqlClient.SqlConnection

+3

SqlConnection non è thread-safe. Non dovresti usarlo su thread multipli. Dovresti invece creare una connessione per thread. –

+1

L'unico modo sicuro per utilizzare un oggetto SqlConnection su più thread è di non utilizzarlo contemporaneamente su più di 1. E sì, qualsiasi stato o configurazione che si modifica su un thread "perde" su qualsiasi thread successivo in questo maniera. –

+0

@ LasseV.Karlsen che ne dici di usare async/await? Penso che THX-1138 si riferisca alla possibilità di più query eseguite simultaneamente sotto la stessa connessione. –

risposta

1

domanda Loaded, una risposta definitiva è impossibile perché, come @ LasseV.Karlsen ha dichiarato SqlConnection non è thread-safe in modo comportamento sta per essere imprevedibile . Ho tentato scenari simili in passato e ho fallito. Ecco cosa penso che accadrà con i parametri nella tua domanda.

SqlConnection elabora le query in parallelo?

No, non sa come perché non è stato progettato per questa attività. Sebbene il fatto che sia possibile costruire un processo per usarlo in questo modo è allettante.

saranno le query essere eseguite in modo sequenziale

Sì. Le query verranno eseguite dal motore SQL nell'ordine ricevuto. Anche se il tuo oggetto di connessione probabilmente non saprà quale thread passare i risultati e otterrai il temuto 'errore di riferimento dell'oggetto'.

c'è una possibilità che questo livello di isolamento può applicare ad altre domande

Sì. Se si modifica il livello di isolamento dell'oggetto di transazione assegnato a SqlConnection e quindi uno dei thread tenta di utilizzare tale connessione, avrà per impostazione predefinita quel livello di isolamento. Il momento in cui un thread secondario lo farà è fuori dal tuo controllo a questo punto. È può assegnare una transazione per comando (e quindi raggiungere un livello di isolamento univoco come desiderato) ma si avrà comunque il problema della connessione non essendo thread-safe.