Kirjautuminen

Haku

Tehtävät

Keskustelu: Ohjelmointikysymykset: HTML: Tietokantaohjelmointi ja virhetilanteet

Sivun loppuun

Matso [09.08.2008 23:33:31]

#

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 :/

ajv [10.08.2008 00:53:35]

#

Et ole yksin noiden "tilanteiden" kanssa ja sen takia niiden hallitsemiseen onkin valmis menetelmä: transaktio

kayttaja-2791 [10.08.2008 11:43:33]

#

Kuten ajv sanoi:
http://dev.mysql.com/doc/refman/5.0/en/commit.html

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).

mrkebab [10.08.2008 11:58:39]

#

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ä.

Matso [10.08.2008 14:33:02]

#

Juuh, sain toimimaan. InnoDB:tä käytän jo foreign keyiden takia.

Grez [10.08.2008 14:49:40]

#

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.

map_ [10.08.2008 20:44:13]

#

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.

Matso [10.08.2008 23:18:41]

#

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.


Sivun alkuun

Vastaus

Aihe on jo aika vanha, joten et voi enää vastata siihen.

Tietoa sivustosta