Wednesday, September 3, 2008

и это снова я про mysql



новыя знания — новыя печали

теперь я использую mysql таким образом:


"DBI:mysql:database=regru_auction;mysql_multi_statements=1;mysql_enable_utf8=1;mysql_auto_reconnect=1"


тогда есть надежда, что можно сразу несколько statements в do напихать, но я уже этим не пользуюсь. парсить sql оказалось проще, чем договориться с mysql.

причем, как показывает опыт, последний флаг не работает вообще. как был morning bug, так и остался. Apache::DBI отдыхает.

но это не все. после ошибки DBD::mysql становится нестабильным и может порождать ошибки типа таких:


DBD::mysql::st bind_columns failed: bind_columns called with 1 values but 10 are needed [for Statement "select count(*) from `auction` "]


для тех, кто в танке: иногда имеет смысл запустить возможно ошибочное sql выражение, чтобы не трясти базу лишний раз. а именно, вместо проверки, есть ли пользователь с таким username/password просто попытаться пользователя туда вставить. тогда, в случае ошибки, мы можем сказать: «э нет, чувак, такое как ты уже есть». ха. не в случае mysql. случай mysql:


eval {
$dbh->do (…);
};

if ($@) {
$dbh->disconnect;
Core::make_new_dbh ();
}


ну и сладкое напоследок.

есть вероятность не выйти из транзакции. то есть после commit или rollback есть вероятность остаться в транзакции со всеми вытекающими. в мануале предлагают дисконнектиться и соединяться заново. а, ну и autoreconnect в таком случае отключается -)

P.S.: совсем забыл. если создать mysql dbh и форкнуться, то есть вероятность чрезвычайно круто попасть впросак, потому что как–то оно очень хуево после этого работает.


мудаки.