InnoDB : SET AUTOCOMMIT (?)

Ekklipce

Новичок
InnoDB : SET AUTOCOMMIT (?)

кажется он включен по дефолту,
ибо инсерт\апдейт в таблицах типа иннодб видны явно...

когда запросом отключаю автокоммит, происходит тоже самое... по доке - модификация данных видна после коммита;

имеет ли место невыполнения оператора над запросами SET AUTOCOMMIT = 0, или отключать в другом месте, или все нормально и так должно быть ?
 

Profic

just Profic (PHP5 BetaTeam)
DDL запросы (в отличии от DML) (если ничего не напутал: первое - запросы изменяющие структуру, второе - изменяющие данные) имеют свое отношение с транзакциями. Какое именно не помню, где-то в мануале про это написано.
 

Ekklipce

Новичок
Только в данном случае речь идёт только о данных..
иду так сказать по книжке, и руллит вовсю вышеописанная неразбериха.. ..как будто автокоммит всегда=1..

PS. ээ... а SET AUTOCOMMIT = 0 - изменяет структуру ?
 

Profic

just Profic (PHP5 BetaTeam)
Стоп протормозил. Транзакция начинается запросом "begin;" заканчивается "commit;" или "rollback;". Любой DDL запрос заканчивает транзакцию. Про SET AUTOCOMMIT читать лень :).

Как проверяешь, что "инсерт\апдейт в таблицах типа иннодб видны явно"? В том же соединении? Так они и будут видны. Транзакции разделяют несколько соединений. Т.е., например, одно соединение убило записи, а в другом они еще видны, но тут в первом выполнили rollback и данные никуда не делись.
 

Ekklipce

Новичок
да, получается в том же соединении..

идея какая ? модифицировать последовательно таблицу (отдельными запросами, а не всеми впачке в купе с откатом или коммит-сохранением), а потом сделать откат..

есть все кормить базу в одной флаконе
типа несколько запросов в одном :

begin;
update\ibsert\delete;
commit\rollback;

то оно воспринимает по крайней мере мгновенный откат rollback, или "запись" данных commit впрочем, это происходит и без указания [commit\rollback].. из чего, а так же из доки, сделал вывод, что происходит автокоммит..

само собой разумеется, что тут разделенное выполнение запросов само собой ничего не даст..

если все так, как точно установить автокоммит=0, или где я напортачил..
 

Profic

just Profic (PHP5 BetaTeam)
Несколько запрсов в одном через mysql_query()? Он этого просто не позволяет.

Еще раз. Все что ты делаешь в пределах транзакции будет видно в том соединении, в котором она начата, но и откатить изменения можно.
Ты никаким образом не сделаешь так, чтобы изменения в таблице стали видны после commit-а транзакции. Они видны всегда. Их только можно откатить, если начата транзакция.
 

Ekklipce

Новичок
запросы, несколько штук выполняются в phpmyadmin or EMS

<"Их только можно откатить, если начата транзакция. ">
так вот с этим и проблемы...

и в доке по этому процессу мало что скахано :(..
как корректно использовать rollback ?
 

Profic

just Profic (PHP5 BetaTeam)
Как работает phpmyadmin надеюсь объяснять не нужно?
Делаешь скрипт, который выполняет несколько запросов через несколько вызовов mysql_query(), первый из которых begin, а последний rollback. Чтобы ты не делал в середине с данными (именно с данными, а не структурой) - при rollback-е они восстановятся.
 

Ekklipce

Новичок
не нужно :)

промежуток времени между "несколькими вызововами" каков ?
при нулевом промежутке все работает :)

если вызовы вызовов mysql_query() в разное время, то откат не пашет..

так и должно работать ?

PS. кажется понял о чем ты..
 
Сверху