Google+ Followers

maandag 21 januari 2013

MySQL zuigt, deel 567475

Soms heb je van die momenten dat je jezelf afvraagt waar we nou helemaal mee bezig zijn.


Wat denk je dat er gebeurt bij het volgende stukje MySQL?


CREATE TABLE foo (id int);
BEGIN;
INSERT INTO foo VALUES (2);
CREATE TABLE bar (id int);
ROLLBACK;
SELECT * FROM foo;

De INSERT op foo staat na een BEGIN, dus de ROLLBACK maakt het ongedaan, logisch.

Nee nee nee meneertje, dit is MySQL:

SELECT * FROM foo;
+------+
| id   |
+------+
|    2 |
+------+
1 row in set (0.00 sec)

WTF?

Nou, in MySQL geven o.a. CREATE TABLE, ALTER TABLE en CREATE INDEX  een 
impliciete COMMIT.

MySQL kan DDL wijzigingen niet via transacties terugrollen. Het is dus opzich logisch dat een wijziging in DDL je transactie stopt. Wat absurd is is dat de transactie wordt gecommit en dat ook nog zonder enige vorm van melding whatsoever.