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

Come bloccare deliberatamente una riga MySQL in modo tale che anche SELECT restituisca un errore?

Se imposti il ​​livello di isolamento della transazione su SERIALIZABLE , InnoDB wil aggiungerà implicitamente LOCK IN SHARE MODE a tutti i SELECT dichiarazioni.

Questa modalità è in conflitto con i blocchi posti da SELECT FOR UPDATE e il SELECT s si bloccherà.

Nota, però, che InnoDB può bloccare più righe di quelle che soddisfano il WHERE condizione. Questo perché blocca tutte le righe scansionate , non solo quelli corrispondenti .

Supponiamo di avere un indice su col1 e questa domanda:

SELECT  *
FROM    mytable
WHERE   col1 = 1
        AND col2 = 2
FOR UPDATE

utilizza questo indice.

Questo bloccherà tutto record con col1 = 1 , anche quelli con col2 <> 2