Detekce lokalizovane promenne
Jan Kasprzak
kas na fi.muni.cz
Čtvrtek Duben 19 09:24:25 CEST 2012
Dobry den,
mam takovy obecny problem, na ktery jsem narazil konkretne u DBI.
Odpojovani z databaze probiha nejak takto (snad jsem se nikde nespletl):
1. odpojuji se pres disconnect:
nejsem-li v AutoCommit modu, vola se implicitne COMMIT
(aspon v DBD::Oracle).
2. odpojuji se pres DESTROY:
nejsem-li v AutoCommit modu
pokud byl spusteny nejaky SQL prikaz ($dbh->{Executed}),
vypise se warning
dale se zavola rollback
dale se zavola disconnect
No a ted je problem, ze pokud nekdo udela
{
local $dbh->{AutoCommit} = 0;
$dbh->do(q{INSERT INTO ...});
...
}
tak vysledkem muze byt COMMIT nebo ROLLBACK podle situace:
- je-li jeste uvnitr toho bloku die, provede se commit
- je-li jeste uvnitr toho bloku disconnect, provede se rollback
- opustime-li blok, provede se commit (pokud nekdo dalsi neda
explicitni rollback ve svem dalsim lokalnim vypnuti AutoCommitu:
{ local $dbh->{AutoCommit} = 0; ... $dbh->rollback; }
Jadro problemu je v tom, ze DBI nezjisti, ze nekdy v minulosti
bylo $dbh->{AutoCommit} lokalizovane a nastavene jinak nez ted.
Muj obecny dotaz je, jestli umim v tuhle situaci nejak detekovat
- napriklad jestli si lze treba pres nejake tie() nechat zasilat callback
v pripade, ze se hodnota neceho meni opustenim bloku, ve kterem je ta
hodnota lokalizovana (local $ta_hodnota).
Diky,
-Y.
--
| Jan "Yenya" Kasprzak <kas at {fi.muni.cz - work | yenya.net - private}> |
| GPG: ID 1024/D3498839 Fingerprint 0D99A7FB206605D7 8B35FCDE05B18A5E |
| http://www.fi.muni.cz/~kas/ Journal: http://www.fi.muni.cz/~kas/blog/ |
Please don't top post and in particular don't attach entire digests to your
mail or we'll all soon be using bittorrent to read the list. --Alan Cox
Další informace o konferenci Perl