Domanda

Considerate questa situazione:

  1. iniziare la transazione
  2. Inserisci 20 record in una tabella con una chiave auto_increment
  3. Prendi la prima id inserto (diciamo che è di 153)
  4. Aggiorna tutti i record nella tabella in cui id >= 153
  5. Commit

è il passo 4 al sicuro?

Cioè, se un altro richiesta arriva quasi esattamente allo stesso tempo, e gli inserti altri 20 record dopo la fase 2 di cui sopra, ma prima del punto 4, ci sarà una condizione di competizione?

È stato utile?

Soluzione

  

Cioè, se un altro richiesta arriva quasi esattamente allo stesso tempo, e gli inserti altri 20 record dopo la fase 2 di cui sopra, ma prima del punto 4, ci sarà una condizione di competizione?

Sì, lo farà.

Dati 21 a 40 sarà bloccato dal 2 transazione.

Operazione 1 sarà bloccato e attendere fino a commit 2 di transazione o il rollback.

Se commit transazione 2, quindi transazione 1 potranno aggiornare i record 40 (compresi quelli inseriti da 2 transazione)

Altri suggerimenti

Non credo che questo può essere catalogato come una condizione di competizione, ma piuttosto come un DBMS specifico comportamento. In sostanza se il DBMS blocca i record appena inseriti, quindi la prima operazione non visualizzare i record dalla seconda fino alla seconda operazione è impegnata.

E naturalmente c'è la questione di bloccare la tavola, se la prima operazione di scrittura blocca il tavolo allora il secondo sarà bloccato sul scrive fino ai primi uno completa. Non so però se il mysql standard offre questo tipo di funzione. So MSSQL lo fa.

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