Aloitan transactionin, teen insertin, ja kutsun rollbackia, mutta silti tieto jää kantaan!?
//$pdo->beginTransaction(); //VIRHE: There is already an active transaction $query = $pdo->prepare('INSERT INTO plaaplaa (jotai, jotai) VALUES (?, ?)'); $query->execute(array("arvo1", "arvo2")); $pdo->rollBack(); //VIRHE: There is no active transaction
Jos yritän alottaa transactionia just ennen tota queryä, niin se sanoo, että on jo aktiivinen transactioni, niinkun pitäiskin.. joten kommentoin sen pois.. no sitten insertin jälkeen kumminkin rollBacki valittaa, että ei ole aktiivista transactionia, ja rivi tallentuu kantaan??! O_o
Muoks.
Tein ihan tällasen yksinkertasen:
$pdo->beginTransaction(); $query = $pdo->prepare("INSERT INTO pages (title) VALUES (?)"); $query->execute(array("testi123432sd")); $id = $pdo->lastInsertId(); $pdo->rollBack(); $query = $pdo->prepare("SELECT * FROM pages WHERE id = ?"); $query->execute(array($id)); if($row = $query->fetch()){ echo "löytyy rollbackin jälkeen!"; }else{ echo "ei ole enää :)"; }
Ja kylläpä vaan jää se insertti sinne kantaan rollbackin jälkeen >:O
Eihän sulla oo käytössä MySQL MyISAM-tauluilla? Ne ei tue transaktioita.
InnoDB-taulut tukee.
Häh, luulin muokanneeni jo ton viestin.
Oli siis MyISAM käytössä.. eiks toi PDO emuloikaan transactioneita, jossei tietokanta tue?
Noup.
https://www.php.net/manual/en/intro.pdo.php:
PDO provides a data-access abstraction layer, which means that, regardless of which database you're using, you use the same functions to issue queries and fetch data. PDO does not provide a database abstraction; it doesn't rewrite SQL or emulate missing features. You should use a full-blown abstraction layer if you need that facility.
Matso kirjoitti:
eiks toi PDO emuloikaan transactioneita, jossei tietokanta tue?
Miten ihmeessä transaktioita voisikaan emuloida? Kuulostaa suunnilleen yhtä hyvältä idealta kuin käyttää ilmapalloja ja yrittää emuloida niillä panssarilasia.
Siis puuttuvia SQL-ominaisuuksia voi toki emuloida (hoitaa prosessointi clientin päässä) mutta transaktioiden emuloiminen kerroksessa, jonka ohikin tietokantaa voidaan käsitellä, on jokseenkin mahdotonta.
<katkera mäkätys>
MySQL:lle on valitettavasti ominaista tällainen vähän sinne päin toimiminen ja virhetilanteiden piilottaminen. Vaikka se ei ymmärtääkseni varsinaisesti epäluotettava olekaan, sen käyttäminen oikein vaatii kohtuuttomasti perehtymistä ja varovaisuutta. Dokumentaatiossa on läjäpäin varoituksia "tämä juttu ei toimikaan tämän kanssa", eikä virheilmoista ole tietoakaan. Hyvänä esimerkkinä vaikkapa transaktion hiljaisesti commitoivat komennot sekä komennot, joita rollback ei oikeasti rollbackaa.
Ja hei oikeesti, kuka hitto keksii tehdä tietokantamoottoriin oletusasetukset, joilla transaktiot jätetään hiljaisesti väliin?
PostgreSQL <3
</katkera mäkätys>
Aihe on jo aika vanha, joten et voi enää vastata siihen.