Lo standard SQL specifica l'ordine di blocco per una query su più tabelle?Cosa determina l'ordine di blocco per una query su più tabelle?
Ad esempio, in:
SELECT department.id FROM permissions, terminals, departments WHERE department.id = ? AND terminal.id = ? AND permissions.parent = department.id AND permissions.child = terminals.id;
- Vuol standard SQL garantiscono un ordine di bloccaggio o viene determinata dal piano di esecuzione (attuazione specifiche)?
- C'è un modo per garantire un ordine di chiusura?
- Se non è possibile garantire l'ordine di blocco, in che modo è possibile impedire i deadlock?
UPDATE: Si prega di non votare per chiudere la questione senza spiegare il tuo ragionamento. Per quanto mi riguarda, questa è una domanda di programmazione, che lo rende molto in tema per StackOverflow. Se ritieni che la domanda debba essere ulteriormente perfezionata, ti preghiamo di spiegare e sarò più che felice di risponderti.
Le query SELECT non generano blocchi che provocano deadlock. Puoi riformulare la tua domanda in modo che sia rilevante per una situazione reale? –
@GordonLinoff, le query SELECT in READ_COMMITTED generano blocchi (ma per la durata dell'istruzione). Per altri livelli di isolamento (come REPEATABLE_READ o SERIALIZABLE) mantengono un blocco fino alla fine della transazione. Avvertenza: alcuni database utilizzano MVCC che non utilizza alcun blocco, ma questi sono fuori dallo scopo di questa domanda. – Gili
I blocchi sono un dettaglio di implementazione. I livelli di isolamento specificano solo i fenomeni che possono/non possono verificarsi. In SQL Server, le query selezionate su read commit richiedono principalmente lock 'S' che vengono rilasciati non appena vengono letti i dati (prima della fine dell'istruzione). A volte questi blocchi possono essere mantenuti fino a quando l'istruzione termina comunque [esempio] (http://blogs.msdn.com/b/craigfr/archive/2007/05/31/read-committed-and-large-objects.aspx) e altre volte non prende affatto le serrature 'S' a livello di riga. E dato il punto 1, i punti 2 e 3 non sono disponibili se non si specifica un particolare RDBMS. –