これは本当ですか?データベースアップグレードの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つずつ実行できるようにするカスタムスクリプトです。