Comportament baze de date

Vrei sa executi urmatorul sir de interogari:

BEGIN;
UPDATE foo SET bar = bar * 10 WHERE id = 1;
ALTER TABLE foo ADD COLUMN baz VARCHAR(20);
UPDATE foo SET baz = CAST(bar AS VARCHAR(20));
COMMIT;

Dar dureaza ceva mai mult si se intampla sa pice reteaua dintre client si server inainte de finalizare (inainte de a trimite COMMIT).

Dupa restabilirea legaturii, in ce stare te astepti sa gasesti foo? In ce stare il gasesti defapt daca incerci asta folosind baza de date preferata?

Eu cred ca se face rollback si ar trebui sa fie la ca inainte de acel update.

I might be wrong tho’

Alter table (ca orice ddl command ) nu poate fi constrînsă într-o tranzacție.

https://dev.mysql.com/doc/internals/en/transactions-notes-on-ddl-and-normal-transaction.html

3 Likes

Depinde cum îți configurezi baza de date, mysql by default are autocommit on.

MS SQL Server si PostgreSQL sunt printre sistemele care pot da cu usurinta inapoi chiar daca tranzactia continea DDL.

MySQL e printre sistemele ce au probleme cu astfel de interogari in interiorul unei tranzactii. Mi s-ar parea insa mai safe sa respinga interogarea cu o eroare decat sa introduca comportament neasteptat.

1 Like