Отключение автокоммита mysql в php не работает

Конечно, я могу что-то делать не так, но я не очень понимаю, почему и как.

Я хочу отключить автоматическую фиксацию в php-скрипте. это потому, что моя личная структура php mysql работает именно так. но почему-то автокоммит нельзя отключить. Я использую Mysqli с таблицами engine=InnoDB и попробовал функциональность mysqli::autocommit, а также операторы mysql для глобальных и сеансовых.

все приводит к одному и тому же ответу: автокоммит все еще включен. Никаких ошибок, говорящих о том, что я использовал неверный оператор, не возвращается. запросы возвращают true, пытались зафиксировать, возвращали true.

есть ли что-то, что мне здесь не хватает? autocommit должен быть отключен во время выполнения, потому что хост, на котором он будет работать, не позволяет мне отключить его в настройках сервера :)


person SomeOne_1    schedule 02.01.2012    source источник
comment
У меня сработало в какой-то ситуации - можете ли вы поделиться каким-либо кодом для этого? Как вы настраиваете/запускаете транзакции? Как убедиться, что вы действительно находитесь в транзакции, прежде чем запускать команды?   -  person pagid    schedule 03.01.2012
comment
Вы пытались выполнить запрос start transaction;?   -  person Marc B    schedule 03.01.2012
comment
ну, в настоящее время у меня отключена автоматическая фиксация, она говорит, что значение автоматической фиксации равно 0. но даже тогда любые запросы на вставку каким-то образом фиксируются. @pageid, все, что я делаю, это отключаю автоматическую фиксацию, запускаю запрос на вставку, а затем запускаю функцию точки сохранения, которая фактически запускает мою функцию сохранения ($commit=false), которая будет выполнять вставку, но не фиксацию. странно то, что save - единственная функция, использующая mysqli_commit...   -  person SomeOne_1    schedule 03.01.2012
comment
ну, я пробовал стартовую транзакцию, в navicat она работает, как и ожидалось, в PHP нет... она все еще фиксируется, в то время как автофиксация отключена и стартовая транзакция выполняется..   -  person SomeOne_1    schedule 03.01.2012
comment
Каким-то образом нужно вызвать откат, теперь моя проблема заключается в том, когда мне выполнять? так как в функции __destruct php уничтожается переменная, содержащая соединение...   -  person SomeOne_1    schedule 03.01.2012


Ответы (2)


http://dev.mysql.com/doc/refman/5.0/en/server-system-variables.html#sysvar_autocommit

По умолчанию клиентские подключения начинаются с autocommit, установленного на 1. Чтобы клиенты начинали с 0 по умолчанию, установите системную переменную init_connect сервера:

SET GLOBAL init_connect='SET autocommit=0';

Переменная init_connect также может быть установлена ​​в командной строке или в файле опций. Чтобы установить переменную, как только что показано, с помощью файла опций, включите следующие строки:

[mysqld]
init_connect='SET autocommit=0'

Также просмотрите следующую ссылку, есть способ вернуть логическое значение, которое укажет был ли коммит успешно включен/выключен.

Также используйте @@autocommit для определения текущего состояния автоматической фиксации.

person Dennis    schedule 02.01.2012
comment
Ну, автокоммит отключен, я понял, что был туп и не получил результат запроса ;). но любые запросы на вставку фиксируются, пока я определенно запускаю запрос на вставку, а не mysqli_commit. Я также попробовал ваше предложение init_connect, но оно не сработало! - person SomeOne_1; 03.01.2012

Благодаря всем вам, я решил свою проблему! Я как-то понял, что когда вы явно не делаете откат или не закрываете свое соединение, вставки фиксируются. с помощью функции register_shutdown_function вы можете выполнить откат или закрыть соединение.

еще раз, спасибо за вашу помощь!

person SomeOne_1    schedule 03.01.2012
comment
Не забудьте отметить свой ответ как принятый или отредактировать наш вопрос и отметить человека, который помог вам на правильном пути, как принятый ответ. - person Stephen; 24.01.2012