Domanda

Sto leggendo un manuale sulle transazioni innodb, ma ancora ci sono molte cose poco chiare per me. Ad esempio, non capisco bene il seguente comportamento:

-- client 1                             -- client 2
mysql> create table simple (col int) 
       engine=innodb; 

mysql> insert into simple values(1);
Query OK, 1 row affected (0.00 sec)

mysql> insert into simple values(2);
Query OK, 1 row affected (0.00 sec)

mysql> select @@tx_isolation;                                                              
+-----------------+                                                                         
| @@tx_isolation  |
+-----------------+
| REPEATABLE-READ |                                                                         
+-----------------+

mysql> begin;                                    
Query OK, 0 rows affected (0.01 sec)            
                                        mysql> begin;
                                        Query OK, 0 rows affected (0.00 sec)

mysql> update simple set col=10 where col=1;
Query OK, 1 row affected (0.00 sec)
Rows matched: 1  Changed: 1  Warnings: 0

                                         mysql> update simple set col=42 where col=2;
                                         -- blocks

Ora, l'ultimo comando di aggiornamento (nel client 2) attende. Mi aspetto che il comando si eseguisca perché suppongo che solo la riga 1 sia bloccata. Il comportamento è lo stesso anche se il secondo comando nel client 2 è insert. Qualcuno potrebbe descrivere lo sfondo di bloccaggio dietro questo esempio (dove e perché i blocchi)?

È stato utile?

Soluzione

InnoDB imposta tipi specifici di blocchi come segue.

  • Seleziona ... da è una lettura coerente, leggendo un'istantanea del database e non è impostata a meno che il livello di isolamento delle transazioni non sia impostato su serializzabile. Per il livello serializzabile, i set di ricerca condiviso i blocchi di successiva chiave sui record dell'indice che incontra.

  • Seleziona ... da ... blocca i set di modalità condivisione condivisi blocchi di successiva chiave su tutti gli indici registra gli incontri di ricerca.

  • Per i registri dell'indice gli incontri di ricerca, selezionare ... da ... per aggiornare blocca altre sessioni dal fare selezione ... da ... bloccare la modalità condivisione o leggere in determinati livelli di isolamento delle transazioni. Le letture coerenti ignoreranno qualsiasi serratura impostata sui record esistenti nella vista lettura.

  • AGGIORNAMENTO ... dove ... imposta un blocco esclusivo successivo su ogni record degli incontri di ricerca.

  • Elimina da ... dove ... imposta un blocco esclusivo successivo su ogni record degli incontri di ricerca.

  • Inserisci imposta un blocco esclusivo sulla riga inserita. Questo blocco è un blocco record di indice, non un blocco successivo (cioè non esiste un blocco di gap) e non impedisce ad altre sessioni di inserire nel gap prima della riga inserita.

InnoDB ha diversi tipi di serrature a livello record:

  • Lock record: questo è un blocco su un record di indice.

  • Gap Lock: questo è un blocco su un divario tra i record di indice o un blocco sul divario prima del primo o dopo l'ultimo record di indice.

  • Lock-key successivo: questa è una combinazione di un blocco record sul record dell'indice e un blocco GAP sul divario prima del record dell'indice.

Vedi altro :

Evitare il problema fantasma usando il blocco successivo

Evitare il deadlock

Altri suggerimenti

Ypercube ha ragione. In particolare, senza un indice unico utilizzato nella condizione, bloccerà più della riga singola interessata.

Per vedere il comportamento che ti aspetti, cambia la creazione della tua tabella in questo:

create table simple (col int unique) ENGINE=InnoDB;

L'indice univoco sul col Il campo gli consentirà di bloccare solo la riga interessata.

"Per i registri dell'indice gli incontri di ricerca, selezionare ... da ... per aggiornare blocca altre sessioni dal fare selezionare ... da ... bloccare la modalità condivisione o leggere in determinati livelli di isolamento delle transazioni. Letture coerenti ignoreranno eventuali blocchi Impostato sui record esistenti nella vista lettura "

Quali sono quei determinati blocchi che possono essere applicati con selezione per l'aggiornamento in modo che altre sessioni non possano leggere il record bloccato?

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