Magentoデータベースのアップグレードは「トランザクション」で行われますか?


12

この問題atmがあります。

クライアントは、ショップをCE 1.4からCE 1.8にアップグレードします。ファイルのアップグレードは順調に進み、データベースのアップグレードも開発マシンで順調に進みました。

クライアントのライブマシンでクライアントのlive-dbをアップグレードしようとすると(1.8-Magentoをデータベースに接続してブラウザーで開く)、プロセスはしばらく実行されているように見え、500エラーで終了します。

PHPエラーログは空です。共有ホストであるため、apacheまたはmysqlの設定を変更することはできません。「特別なim magentoホスティング」にもかかわらず、ホスティング事業者は設定を変更することを望んでおらず、500エラーが発生したときにブラウザウィンドウを繰り返し更新することでデータベースのアップグレードを完了できると教えてくれます。 。これは数時間続く場合があります。

私の質問は次のとおり
です。-これは本当ですか?データベースアップグレードのsqlステートメントはトランザクションにラップされるため、何か問題が発生した場合はロールバックできると考えました。
-答えは、この質問の答えを見つけるためにコードを調べることができるヒントを提供できますか?

御時間ありがとうございます!


2
関連する可能性がある:移行スクリプトを1つずつ実行できる新しいn98-magenrunコマンド。 github.com/netz98/n98-magerun/pull/274
アランストーム

回答:


8

これは本当ですか?データベースアップグレードのsqlステートメントはトランザクションにラップされるため、何か問題が発生した場合はロールバックできると考えました。

エンジニアリングの本能は健全ですが、ビジネススタートアッププログラミングの現実の世界で起こることは、より複雑/ ugいです。

Magentoのセットアップリソースシステム、トランザクション内の個々のスクリプトをラップしません。これには多くの理由がありますが、主な理由は、MagentoがMySQLに明示的に関連付けられたライフを開始し、MySQLの多く/ほとんどのデータ定義ステートメント(ALTER TABLEなど)が暗黙のコミットを引き起こすと常に考えていました。

個々のセットアップリソースがトランザクションを使用する場合があります。

#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のインクルード後に明示的に終了し、それを再実行する一時的なコアハック/コードプールオーバーライドです。これにより、セットアップリソーススクリプトが途中で停止する可能性が低くなります。

より良い解決策、そして私の個人的な「たぶんいつか」プロジェクトの1つは、Magentoコアメソッドを使用して、適用する必要のある更新プログラムを調べ、リストし、ユーザーが1つずつ実行できるようにするカスタムスクリプトです。


素晴らしい答えと洞察力、ありがとう。また、私の問題を解決する方法のヒント。最終的にdev.-serverのデータベースをアップグレードし、「準備完了」のデータベースを新しいシステムにインポートしました。
simonthesorcerer

2
FWIW、その「たぶん1日」プロジェクトは、n98-magerun magerun.net
アランストーム

@AlanStormのスクリプトの準備ができたら教えてください;)
fkoessler

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.