Глючит ALTER и INSERT в транзакции

Romantik

TeaM PHPClub
Глючит ALTER и INSERT в транзакции

Приветствую уважаемые.
Вот столкнулся с проблемой (попробую детально описать):
MySQL 3.23.55
таблицы были BerkeleyDB
потом перекомпилил под InnoDB
первая строчка warehouse в инсталяции добавляется.
с MyISAM работает на УРА, но нужна транзакция!
в транзакции необходимо сделать INSERT и ALTER
PHP:
<?
....
$db->autoCommit(false); #PEAR использую

$sql_alter="ALTER TABLE wares ADD ware1 double(10,5) DEFAULT '0' NOT NULL"; # пробовал и "ADD COLUMN"
$res_alter= $db->query($sql_alter);

$id = $db->nextId(sq_ware);
$sql = "INSERT INTO warehouse (id,name,user,stat) VALUES ('$id','$name','$user',1)";
$res = $db->query($sql);

 if( ($res) AND ($res_alter) )
 Header...
 else
 $db->rollback();
?>
Транзакция успешно выполняется и SELECT * FROM warehouse
информирует о добавлении строчки.
Далее через пару секунд (при BDB нередко подвисал так, что умирала муська и показывала num_rows=2 хотя в базе SELECT показывал одну строчку)
SELECT показывает что добавленной строчки НЕТ!
Но добавленное поле существует, значит транзакция не откатилась!
Интересно дальше: обнуляю таблицы и пробую опять запустить скрипт. SELECT показывает ту добавленную строчку, котрую я добавлял ранее до обнуления!!! =))

подозревал на жесткий диск, но нет он в порядке!
 

Romantik

TeaM PHPClub
Вот ошибка PEAR на очередное добавление:
DB Error: unknown error
INSERT INTO warehouse (id,name,user,stat) VALUES ('2','тест1','2',1) [nativecode=1205 ** Lock wait timeout exceeded; Try restarting transaction]
 

deek

Новичок
очень похоже, что где-то забыт COMMIT;

а что говорит innodb_lock_monitor ?
 

si

Administrator
не все базы, позволяют смешивать в транзакции DDL и DML

Раскрой секрет зачем менять структуру на во время работы приложения да еще в транзакции.
 

deek

Новичок
"8.7 When does MySQL implicitly commit or rollback a transaction?

The following SQL statements cause an implicit commit of the current transaction in MySQL: ..., ALTER TABLE, ..."

потому что блокировки у InnoDB делаются на уровне записи.

кстати, а зачем
PHP:
 $db->autoCommit(false);
 
Сверху