MySQL transaction/rollback med PHP

Permalänk
Medlem

MySQL transaction/rollback med PHP

Hej!

Jag har en databas med två tabeller. Jag försöker göra två INSERT statements, en gång per tabell. Jag vill bara att det skall sparas om bägge INSERT statementsen lyckas.

Koden:
$commit = "COMMIT";
mysql_query("SET AUTOCOMMIT = 0", $identifier);
mysql_query("BEGIN", $identifier);

$sql = "INSERT INTO table1... ";
if(!mysql_query($sql, $identifier))
{
$commit = "ROLLBACK";
}

$sql = "INSERT INTO table2... ";
if(!mysql_query($sql, $identifier))
{
$commit = "ROLLBACK";
}

mysql_query($commit, $identifier);

När jag kommer till raden efter: $sql = "INSERT INTO table2... "; dvs när jag ställer min andra insert fråga så får jag följande fel:

MySQL server has gone away
Error reading result set's header

Är det något jag missat? Googlat runt en del blir inte klokare tycker det ser korrekt ut. Några idéer?

Permalänk
Medlem
Citat:

Ursprungligen inskrivet av Mahme
Hej!

Jag har en databas med två tabeller. Jag försöker göra två INSERT statements, en gång per tabell. Jag vill bara att det skall sparas om bägge INSERT statementsen lyckas.

[...]

Testa någon av dessa:

try { mysql_query("SET AUTOCOMMIT = 0", $identifier); mysql_query("BEGIN", $identifier); $sql = "INSERT INTO table1... "; if(!mysql_query($sql, $identifier)) throw new Exception('Insert failed'); $sql = "INSERT INTO table2... "; if(!mysql_query($sql, $identifier)) throw new Exception('Insert failed'); mysql_query("COMMIT", $identifier); } catch (Exception $e) { mysql_query("ROLLBACK", $identifier); } finally { //Stäng connection. }

Eller denna variant:

mysql_query("SET AUTOCOMMIT = 0", $identifier); mysql_query("BEGIN", $identifier); $sql = "INSERT INTO table1... "; if(!mysql_query($sql, $identifier)) mysql_query("ROLLBACK", $identifier); return false; $sql = "INSERT INTO table2... "; if(!mysql_query($sql, $identifier)) mysql_query("ROLLBACK", $identifier); return false; mysql_query("COMMIT", $identifier);

Eller denna:

mysql_query("SET AUTOCOMMIT = 0", $identifier); mysql_query("BEGIN", $identifier); $sql = "INSERT INTO table1... "; mysql_query($sql, $identifier); $sql = "INSERT INTO table2... "; mysql_query($sql, $identifier); if (mysql_error()) mysql_query("ROLLBACK", $identifier); else mysql_query("COMMIT", $identifier);

Personligen gillar jag try-catch bäst för den visar tydligt när det blir fel och att man har en finally, som stänger ner connection oavsett resultat. Jag har inte testat att köra try-catch-finally i php, men på det där sättet gör jag i alla fall i C#.

Visa signatur

ηλί, ηλί, λαμά σαβαχθανί!?

Permalänk
Medlem

Tack för svaret, men jag får samma felmeddelanden som tidigare. Första INSERT går igenom men raden när man ställer andra INSERT frågan får jag errors på.

MySQL server has gone away.
Error reading result set's header.

Bägge dessa felen pekar på samma rad.

Permalänk
Medlem
Citat:

Ursprungligen inskrivet av Mahme
Tack för svaret, men jag får samma felmeddelanden som tidigare. Första INSERT går igenom men raden när man ställer andra INSERT frågan får jag errors på.

MySQL server has gone away.
Error reading result set's header.

Bägge dessa felen pekar på samma rad.

Om du gör dessa querys direkt mot databasen (i kommandoraden, phpmyadmin eller något annat verktyg) får du samma fel då?

Visa signatur

ηλί, ηλί, λαμά σαβαχθανί!?

Permalänk
Medlem

Funkar hur bra som helst via kommandoraden.

EDIT:
Fick det att fungera nu, i den andra tabellerna sparar jag bilder (mediumblob) det var alltid där, vid den andra INSERT som det failade på. Jag skickade tidigare in en bild på 1.5mb, testade nu att skicka in en bild på 0.5mb så fungerade det direkt.

Det jag inte förstår är att på min php.ini är det specificerat att min upload_max_filesize är på 2mb (default) vilket då inte borde generera det här typen av fel?

Permalänk
Medlem
Citat:

Ursprungligen inskrivet av Mahme
Funkar hur bra som helst via kommandoraden.

EDIT:
Fick det att fungera nu, i den andra tabellerna sparar jag bilder (mediumblob) det var alltid där, vid den andra INSERT som det failade på. Jag skickade tidigare in en bild på 1.5mb, testade nu att skicka in en bild på 0.5mb så fungerade det direkt.

Det jag inte förstår är att på min php.ini är det specificerat att min upload_max_filesize är på 2mb (default) vilket då inte borde generera det här typen av fel?

Ok. Då vet vi att det inte är fel på databasen i alla fall.

Troligtvis är det en inställning som gör den där begränsningen i apache (eller vilken webbserver du nu använder) och/eller php.

Apache har en "LimitRequestBody" som ligger på 512kb som default (tror jag) så denna kan du testa ändra.

Du borde även få loggar på detta, om inte så borde du kika lite på loggningen. Det kan hjälpa.

Visa signatur

ηλί, ηλί, λαμά σαβαχθανί!?

Permalänk
Medlem
Citat:

Ursprungligen inskrivet av Mahme
Funkar hur bra som helst via kommandoraden.

EDIT:
Fick det att fungera nu, i den andra tabellerna sparar jag bilder (mediumblob) det var alltid där, vid den andra INSERT som det failade på. Jag skickade tidigare in en bild på 1.5mb, testade nu att skicka in en bild på 0.5mb så fungerade det direkt.

Det jag inte förstår är att på min php.ini är det specificerat att min upload_max_filesize är på 2mb (default) vilket då inte borde generera det här typen av fel?

Du kan ju ha satt en begränsning på din BLOB kolumn i tabellen.

Visa signatur

Fractal Design Arc Svart | MSI Z68A-GD55 G3 REV B3 | Intel® Core i7 2600K, 3.4GHz, 8MB | Corsair 16GB (4x4096MB) CL9 1600Mhz VENGEANCE LP | MSI GeForce GTX 670 | Phanteks PH-TC14PE CPU Cooler (vit) | Corsair Power Supply 650W TX M, Modular, ATX, PS/2 | SSD (okänd tillverkare) + 2 äldre SATA2 diskar på 750 Gb, 350 gb. | OS: Microsoft Windows 10 home.