Происходит ли обновление базы данных Magento в «транзакции»?

12

У нас есть эта проблема atm:

Клиент обновляет свой магазин с CE 1.4 до CE 1.8. Обновление файлов прошло успешно, а обновление базы данных также прошло успешно на нашей машине для разработки.

Когда мы пытаемся обновить live-db клиента на его live-машине (подключить 1.8-Magento к базе данных и открыть его в браузере), процесс, кажется, запускается некоторое время и заканчивается ошибкой 500.

Журнал ошибок PHP пуст; так как это общий хост, мы не можем изменить настройки apache или mysql; хостер, хотя и «специализированный im magento hosting», не желает менять настройки и говорит мне, что я мог бы завершить обновление базы данных, многократно обновляя окно браузера при возникновении ошибки 500, потому что magento будет обновляться небольшими шагами , Это может продолжаться часами.

Мой вопрос сейчас:
- Это правда? Я думал, что sql-операторы для обновлений базы данных будут обернуты в транзакции, поэтому их можно откатить, если что-то пойдет не так.
- Может ли ответ дать подсказку, где я мог бы посмотреть в коде, чтобы найти ответ на этот вопрос?

Спасибо за ваше время!

simonthesorcerer
источник
2
Возможно актуально: новая команда n98-magenrun, которая позволит вам запускать сценарии миграции по одному. github.com/netz98/n98-magerun/pull/274
Алан Сторм

Ответы:

8

Это правда? Я думал, что sql-операторы для обновлений базы данных будут обернуты в транзакции, поэтому их можно откатить, если что-то пойдет не так.

Ваши инженерные инстинкты здоровы, но то, что происходит в реальном мире программирования стартапов для бизнеса, более сложно / безобразно.

Система ресурсов установки Magento не включает отдельные сценарии в транзакцию. Для этого есть множество причин, но я всегда предполагал, что основной причиной является то, что Magento начал свою жизнь явно с MySQL, и многие / большинство операторов определения данных ( ALTER TABLEи т. Д.) В MySQL вызывают неявную фиксацию .

Хотя вы найдете индивидуальные настройки ресурса, иногда используйте транзакции.

#File: app/code/core/Mage/Sales/sql/sales_setup/mysql4-upgrade-1.3.99-1.4.0.0.php
$installer->getConnection()->beginTransaction();
$installer->run("
        UPDATE {$installer->getTable('sales_flat_order')} AS o, {$installer->getTable('sales_order_entity_varchar')} AS od
    //...    

Сама система просто запускает сценарии и надеется на лучшее.

Если вы заинтересованы в коде, который запускает эти ресурсы, лучшее место для начала, вероятно, здесь

#File: app/code/core/Mage/Core/Model/Resource/Setup.php
protected function _modifyResourceDb($actionType, $fromVersion, $toVersion)
{
    //...
}

_modifyResourceDbМетод является тот , который включает в себя фактические сценарии установки ресурсов

#File: app/code/core/Mage/Core/Model/Resource/Setup.php
case 'php':
    $conn   = $this->getConnection();
    $result = include $fileName;
    break;
case 'sql':
    $sql = file_get_contents($fileName);
    if (!empty($sql)) {

        $result = $this->run($sql);
    } else {
        $result = true;
    }
    break;

Очень хакерским решением вашей проблемы было бы временное переопределение core-hack / code-pool-override, которое было явно завершено после 5-10 включений, и повторите его. Это уменьшило бы вероятность того, что сценарий установки установится на полпути.

Лучшим решением, и одним из моих личных проектов «возможно, один день», был бы пользовательский скрипт, который использовал основные методы Magento для проверки обновлений, которые необходимо применить, перечисления их и предоставления пользователям возможности просматривать их один за другим.

Алан Сторм
источник
Отличный ответ и отличное понимание, спасибо; также для подсказки, как решить мою проблему. В итоге я обновил базу данных на dev-сервере и импортировал готовую базу данных в новую систему.
simonthesorcerer
2
FWIW, этот «возможно один день» проект стал системой: setup: incremental команда в n98-magerun magerun.net
Алан Сторм
Дайте мне знать, когда вы подготовите этот скрипт @AlanStorm;)
fkoessler