Monesti tietokantaohjelmoinnissa (ainakin itsellä) tulee tilanteita, joissa tehään peräkkäin muutoksia kantaan ja joissa molemmat muutokset liittyvät toisiinsa, mutta mitäs sitten kun jälkimmäisessä kyselyssä tapahtuu virhe? Ensimmäinen kysely on kuintekin jo lisännyt tai muuttanut jotain tietoa.
Pitäskö vaan olettaa, että kun ohjelma on tehty hyvin, niin ei tule niitä virheitä, vai pitäskö kaikkia tällasia varten tehdä ikäänkun alkuarvojen palautus, eli jos jälkimmäisessä tapahtuu virhe, niin olis aina koodin pätkä palauttamassa ensimmäisenkin kyselyn muutokset takasin?
Voisko tällasen alkuarvojen palautuksen tehdä jotenkin funktiolla? Ainakin jos vaan asetetaan uusi tietue, on muutosten poistaminen helppoa ID:n perusteella, mutta esimerkiks updateissa pitäs aina ottaa alkuperäset arvot talteen ym :/
Et ole yksin noiden "tilanteiden" kanssa ja sen takia niiden hallitsemiseen onkin valmis menetelmä: transaktio
Kuten ajv sanoi:
http://dev.mysql.com/doc/refman/5.0/en/commit.
Eli vaikka aloitat transaktion kun tälläinen sarja muutoksia alkaa (BEGIN), ja lopuksi hyväksyt jos kaikki menee ok (COMMIT). Jos jotain menee pieleen, hylkää transaktiossa tekemäsi muutokset (ROLLBACK).
Et kertonut mikä tietokanta on käytössäsi, mutta jos MySQL, niin muista että transaktiot eivät ole mukana MySQL:n default "tietokantamottorissa" eli MYISAM:ssa.
Käytä vaikka INNODB:tä.
Juuh, sain toimimaan. InnoDB:tä käytän jo foreign keyiden takia.
mrkebab kirjoitti:
MySQL:n default "tietokantamottorissa" eli MYISAM:ssa.
Toi innodb taitaa olla vakiona nykyään, ainakin joissakin tapauksissa. Esim. Debianiin jos valitsee MySQL:n asennettavaksi, niin siinä on vakiona InnoDB.
Jos ohjelmallasi on useampi käyttäjä kerrallaan niin kannattaa jossain vaiheessa tutustua myös tähän: http://en.wikipedia.org/wiki/Isolation_level
Transaktiot kyllä takaavat aina tuon peruutusmahdollisuuden, mutta se, miten ne tarkkaan ottaen toimivat kun tietokantaa käsittelee useammalla yhteydellä kerrallaan, onkin monimutkaisempaa. Ihannetapauksessahan transaktiot tapahtuisivat muidenkin yhteyksien näkökulmasta joko kokonaan tai ei ollenkaan, mutta todellisuudessa tästä joudutaan tehokkuuden takia yleensä hieman joustamaan.
map_ kirjoitti:
Jos ohjelmallasi on useampi käyttäjä kerrallaan niin kannattaa jossain vaiheessa tutustua myös tähän: http://en.wikipedia.org/wiki/Isolation_level
Transaktiot kyllä takaavat aina tuon peruutusmahdollisuuden, mutta se, miten ne tarkkaan ottaen toimivat kun tietokantaa käsittelee useammalla yhteydellä kerrallaan, onkin monimutkaisempaa. Ihannetapauksessahan transaktiot tapahtuisivat muidenkin yhteyksien näkökulmasta joko kokonaan tai ei ollenkaan, mutta todellisuudessa tästä joudutaan tehokkuuden takia yleensä hieman joustamaan.
Täytyypä tutustua tuohonkin jossain vaiheessa sitten.
Aihe on jo aika vanha, joten et voi enää vastata siihen.