Wie kann ich eine InnoDB-Tabelle sperren, um Aktualisierungen zu verhindern, während diese Tabelle kopiert wird?

Ich möchte eine Tabelle vorübergehend sperren, um zu verhindern, dass andere gleichzeitige Prozesse Änderungen daran vornehmen. Der Grund dafür ist, dass diese Tabelle in eine temporäre Tabelle kopiert, geändert und dann zurückkopiert wird (das Original wird tatsächlich gelöscht und die neue Tabelle umbenannt). Nachdem dies alles abgeschlossen ist, möchte ich die Tabelle entsperren und hoffentlich alles, was versucht wurde, während der Sperre wieder aufzunehmen.

Ich muss auch in der Lage sein, aus der Tabelle zu lesen, die gesperrt wurde, um die neue Tabelle zu erstellen.

Folgendes habe ich versucht, aber es scheint nicht zu funktionieren.

$mysqli = new mysqli(DB_HOST, DB_USER, DB_PASSWORD, DB_NAME, DB_PORT);

$mysqli->autocommit(false)

// create a table to hold parts to keep
$q1 = "CREATE TABLE new_table LIKE my_table;";
$res1 = $mysqli ->query($q1);       

// Lock table to avoid concurrent update issues
$q2 = "LOCK TABLE my_table WRITE;";
$res2 = $mysqli ->query($q2);           

// Insert data to keep into new table   
$q3 = "INSERT INTO new_table SELECT * FROM my_table WHERE some_id IN (SELECT ID FROM table2)";
$res3 = $mysqli ->query($q3);

// drop original table
$q4 = "DROP TABLE my_table;";
$res4 = $mysqli ->query($q4);

// rename new table
$q5 = "RENAME TABLE new_table TO my_table;";
$res5 = $mysqli ->query($q5);

$mysqli ->commit(); // commit changes and re-enable autocommit

$q = "UNLOCK TABLES;";
$res = $mysqli ->query($q); 

Zum Testen habe ich mit PHPmyadmin den Befehl "SET AUTOCOMMIT = 0; LOCK TABLE my_table WRITE;" Abfrage und dann versucht, etwas aus my_table zu löschen, und ich war in der Lage, dies zu tun. Ich möchte das blockieren. Nach der Ausgabe der lock-Anweisung schlägt der Rest der Prozedur fehl und nichts wird geändert.

Antworten auf die Frage(1)

Ihre Antwort auf die Frage