Чи відбувається оновлення бази даних Magento в рамках "транзакції"?


12

У нас це питання atm:

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

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

Журнал помилок PHP порожній; оскільки це спільний хост, ми не можемо змінити налаштування apache або mysql; хостер, хоч "спеціалізований хостинг для ім magento", не бажає змінювати налаштування і каже мені, що я можу закінчити оновлення бази даних, повторно оновлюючи вікно браузера, коли трапиться помилка 500, тому що магенто буде потім оновлений невеликими кроками . Це може тривати годинами.

Моє запитання зараз:
- Це правда? Я думав, що заяви-sql для оновлення баз даних будуть зафіксовані в транзакції, тому їх можна буде повернути, якщо щось піде не так.
- Чи міг би відповідь дати підказку, де я можу заглянути в коді, щоб знайти відповідь на це питання?

Дякую за ваш час!


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

Відповіді:


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;

Дуже хакітним рішенням вашої проблеми було б тимчасове переключення ядра / коду-пулу, яке явно вийшло після 5-10 включення та повторно запустити це. Це зменшило б шанс виправити скрипт ресурсу установки на півдорозі.

Кращим рішенням, і одним із моїх особистих проектів "можливо один день" буде власний скрипт, який використовував основні методи Magento, щоб вивчити оновлення, які потрібно застосувати, перерахувати їх, і дозволити користувачам проходити через них по черзі.


Чудова відповідь & чудовий огляд, дякую; також для поради, як вирішити мою проблему. Я закінчив оновлення бази даних на сервер dev. і імпорт "готового" db в нову систему.
simonthesorcerer

2
FWIW, що проект "можливо одного дня" став системою: setup: інкрементна команда в n98-magerun magerun.net
Алан Шторм

Повідомте мене, коли ви готові цей сценарій @AlanStorm;)
fkoessler

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.