Mysql
 sql >> Datenbank >  >> RDS >> Mysql

Wie kann man eine MySQL-Zeile absichtlich sperren, sodass sogar SELECT einen Fehler zurückgibt?

Wenn Sie die Transaktionsisolationsstufe auf SERIALIZABLE setzen , InnoDB wil LOCK IN SHARE MODE implizit anhängen an alle SELECT Aussagen.

Dieser Modus steht im Konflikt mit den Sperren, die durch SELECT FOR UPDATE gesetzt wurden und das SELECT s wird gesperrt.

Beachten Sie jedoch, dass InnoDB kann mehr Zeilen sperren, als WHERE erfüllen Zustand. Dies liegt daran, dass alle gescannten Zeilen gesperrt werden , nicht nur die übereinstimmenden .

Angenommen, Sie haben einen Index auf col1 und diese Abfrage:

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

verwendet diesen Index.

Dadurch werden alle gesperrt Datensätze mit col1 = 1 , auch solche mit col2 <> 2