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

So verhindern Sie implizites Commit von mysql

Ein weiterer hackiger Ansatz, den ich gerade erfolgreich ausprobiert habe, besteht darin, die DDL zum Erstellen einer Tabelle über den mysql-spezifischen Befehl

abzurufen
SHOW CREATE TABLE `tableName`

Machen Sie dann etwas Regexp-Magie und erstellen Sie eine neue DDL-Abfrage, die eine temporäre Tabelle basierend auf der ursprünglichen Tabelle erstellt, wobei alle Änderungen der alter table in die Erstellungstabelle integriert werden.

In meinem PHP-basierten Projekt habe ich Folgendes getan, um einer temporären Tabelle einen eindeutigen Index hinzuzufügen. Es hat funktioniert, und während der Transaktion ist kein implizites Commit mehr aufgetreten.

$createDDL = ... get from SHOW CREATE TABLE `tableName`
$nr = 0;
$createDDL = preg_replace("/CREATE TABLE `$tableName` \(/", "CREATE TEMPORARY TABLE `$tmpName` (\nUNIQUE `ukey-1` ($uniqCols),", $createDDL, -1, $nr);
if (!$nr)
  throw new Exception("CREATE TABLE replacement error. No reps made.");
mysqli_query($con, $createDDL);

BEARBEITEN Übrigens hier sind einige Bug (Feature) Reports (seit vielen Jahren). In der ersten sehen Sie eine Antwort (aus dem Jahr 2006), die besagt:Da dieses Verhalten das gleiche wie in Oracle db ist, ist dies das konsistente ...

Vielleicht sollte eine Feature-Anfrage "Spamming-Kampagne" initiiert werden, damit diese Feature-Anfrage wiederbelebt wird!