Assumendo:Un'operazione INSERT può provocare un deadlock?
- Sto usando REPEATABLE_READ o di isolamento delle transazioni SERIALIZABLE (serrature ottenere mantenuto ogni volta che accedere a una riga)
- Stiamo parlando di più thread di accesso a più tavoli contemporaneamente.
Ho le seguenti domande:
- E 'possibile per un'operazione
INSERT
per provocare una situazione di stallo? In tal caso, fornire uno scenario dettagliato che mostri come può verificarsi un deadlock (ad esempio, il thread 1 esegue questa operazione, il thread 2 lo fa, ..., deadlock). - Per i punti bonus: rispondere alla stessa domanda per tutte le altre operazioni (ad esempio SELECT, UPDATE, DELETE).
UPDATE: 3. Per i punti bonus super: come posso evitare una situazione di stallo nel seguente scenario?
tavoli proprio:
- autorizzazioni
[id BIGINT PRIMARY KEY]
- aziende
[id BIGINT PRIMARY KEY, name VARCHAR(30), permission_id BIGINT NOT NULL, FOREIGN KEY (permission_id) REFERENCES permissions(id))
ho creare una nuova società come segue:
- INSERT INTO permessi; - Inserts permissions.id = 100
- INSERIRE IN aziende (nome, permission_id) VALUES ('Nintendo', 100); - Inserti companies.id = 200
cancello una società come segue:
- SELEZIONA permission_id da società WHERE id = 200; - restituisce permission_id = 100
- ELIMINA DA società DOVE id = 200;
- ELIMINA DA autorizzazioni DOVE id = 100;
Nell'esempio precedente, l'ordine di blocco INSERT è [autorizzazioni, aziende] mentre l'ordine di blocco DELETE è [aziende, autorizzazioni]. C'è un modo per correggere questo esempio per l'isolamento REPEATABLE_READ
o SERIALIZABLE
?
Uno scenario definito come un singolo utente (in una singola transazione) inserimento, selezione e la cancellazione non sta per causare un deadlock. –
@CleverIdeaWidgetry, ho chiarito la domanda per riflettere sul fatto che stiamo parlando di più thread e tabelle. – Gili
La risposta alla tua domanda di base "può?" è sì - come altri hanno già detto. C'è qualche ostacolo che ti impedisce di testare il tuo scenario da solo? –