Mysql
 sql >> Database >  >> RDS >> Mysql

Comportamento MySQL "seleziona per l'aggiornamento".

Permettetemi di esaminare i vostri casi e spiegare come funzionano questi lucchetti:

1 caso

T1 vuole aggiornare alcune righe nella tabella di test. Questa transazione inserisce il blocco IX su tutta la tabella e il blocco X sulle prime 5 righe.

T2 vuole aggiornare alcune righe nella tabella di test. Questa transazione blocca IX (perché IX compatibile con IX) su tutta la tabella e tenta le prime 5 righe ma non può farlo perché X non è compatibile con X

Quindi stiamo bene.

caso 2.1

T1 vuole aggiornare alcune righe nella tabella di test. Questa transazione ha impostato il blocco IX su tutta la tabella e il blocco X sulle prime 5 righe.

T2 vuole selezionare alcune righe dalla tabella di test. E non inserisce alcun blocco (perché InnoDB fornisce letture non bloccanti)

caso 2.1

T1 vuole aggiornare alcune righe nella tabella di test. Questa transazione ha impostato il blocco IX su tutta la tabella e il blocco X sulle prime 5 righe.

T2 desidera aggiornare (selezionare per l'aggiornamento) alcune righe dalla tabella di test. Posiziona IS sull'intero tavolo e cerca di ottenere il blocco S sulla riga e fallisce perché X e S non sono compatibili.

Inoltre, fai sempre attenzione al livello di isolamento:livelli diversi causano meccanismi diversi per liberare/acquisire blocchi

Spero che aiuti