Rails транзакции - PullRequest
       50

Rails транзакции

1 голос
/ 05 декабря 2008

Я пытаюсь использовать ActiveRecord::Base.transaction. Я полагал, что откат не работает по умолчанию с использованием Rails 1.2.6 и mysql 5.0. Поиграв с этим немного больше, я обнаружил, что autocommit не установлено в 0 при подключении к MySQL.

Вопросы:

1) Как отключить автокоммит в рельсах для всех соединений?

2) Будет ли это иметь негативное влияние на другой код, который не должен быть транзакционным?

Ответы [ 4 ]

5 голосов
/ 05 декабря 2008

Если у вас есть смесь кода, который требует явных транзакций и кода, который может полагаться на автокоммит, возможно, вам не следует отключать автокоммит для всех соединений. Вы на правильном пути, гадая, повлияет ли это на другой код. Если вы отключите автокоммит, но другой код не знает, что он должен фиксировать, чтобы его работа была зафиксирована, тогда это будет проблемой. Неподтвержденная работа откатывается при закрытии соединения.

Вы должны знать, что механизм хранения по умолчанию для MySQL - MyISAM , который вообще не поддерживает транзакции. Когда вы вносите изменения в таблицу, в которой используется MyISAM, эти изменения вступают в силу немедленно, независимо от ваших явных запросов на начало и завершение транзакций, а также независимо от состояния автоматической фиксации. Таким образом, вы не сможете откатиться ни на что, если только вы не создали свои таблицы с использованием механизма хранения InnoDB (или других механизмов хранения с безопасными транзакциями, таких как BDB ).

не нужно , чтобы отключить режим автоматической фиксации для использования транзакций в MySQL. Просто начните транзакцию явно. Следующие операторы SQL будут являться частью транзакции до тех пор, пока вы не подтвердите или не откатите эту транзакцию независимо от значения autocommit для текущего соединения.

http://dev.mysql.com/doc/refman/5.0/en/commit.html говорит:

С START TRANSACTION, автокоммит остается отключенным, пока вы не закончите транзакция с помощью COMMIT или ROLLBACK. Режим автоматической фиксации затем возвращается к его предыдущее состояние.

1 голос
/ 07 декабря 2008

Правильный ответ. Я делал DROP TABLE IF EXISTS в моем коде в начале транзакций. В MySQL, похоже, есть проблема с инструкциями DROP внутри транзакции:

http://bugs.mysql.com/bug.php?id=989

Достаточно забавно, что я угадал правильный обход проблемы, отправляющей "SET aucotommit = 0" перед оператором DROP.

Спасибо за вашу помощь

1 голос
/ 05 декабря 2008

Вам не нужно отключать автокоммит для использования транзакций. Когда вы запускаете настройку автоматического подтверждения транзакции, это не имеет значения, вам необходимо явно указать COMMIT или ROLLBACK. Кроме того, отключение автоматической фиксации повлияет на ваш нетранзакционный код.

0 голосов
/ 06 декабря 2008

Не то, чтобы у меня был какой-либо конкретно нетранзакционный код - это в основном все объекты ActiveRecord, я просто хочу иметь откат при сбое одного из моих методов.

Я буду исследовать больше, вы, кажется, правы - я могу подтвердить ваш ответ в консоли mysql. Однако в моем приложении на Rails мне нужно выполнить connection.execute ("set autocommit = 0"), чтобы откат заработал.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...