Magento 데이터베이스 업그레이드는 "트랜잭션"에서 이루어 집니까?


12

우리는이 문제를 가지고 있습니다 :

고객은 상점을 CE 1.4에서 CE 1.8로 업그레이드합니다. 파일 업그레이드가 잘 진행되었고 데이터베이스 업그레이드도 개발 시스템에서 잘 진행되었습니다.

라이브 머신에서 클라이언트의 라이브 -DB를 업그레이드하려고하면 (1.8-Magento를 데이터베이스에 연결하고 브라우저에서 열면) 프로세스가 잠시 동안 실행되고 500 오류로 종료됩니다.

PHP 오류 로그가 비어 있습니다. 공유 호스트이므로 아파치 또는 mysql 설정을 변경할 수 없습니다. 호스트는 "전문화 된 im magento 호스팅"이지만 설정을 변경하지 않고 500 오류가 발생하면 브라우저 창을 반복해서 새로 고침하여 데이터베이스 업그레이드를 완료 할 수 있다고 알려줍니다. magento는 작은 단계로 업그레이드되기 때문입니다 . 몇 시간 동안 계속 될 수 있습니다.

내 질문은 지금 :
-이것이 사실입니까? 데이터베이스 업그레이드에 대한 sql-statements가 트랜잭션으로 래핑되므로 문제가 발생하면 롤백 될 수 있다고 생각했습니다.
-답변이 코드에서이 질문에 대한 답변을 찾을 수있는 힌트를 제공 할 수 있습니까?

시간 내 줘서 고마워!


2
아마도 관련성 : 새로운 n98-magenrun 명령으로 한 번에 하나씩 마이그레이션 스크립트를 실행할 수 있습니다. github.com/netz98/n98-magerun/pull/274
Alan Storm

답변:


8

이것이 사실입니까? 데이터베이스 업그레이드에 대한 sql-statements가 트랜잭션으로 래핑되므로 문제가 발생하면 롤백 될 수 있다고 생각했습니다.

엔지니어링 본능은 건전하지만 실제 비즈니스 스타트 업 프로그래밍에서 발생하는 일은 더 복잡하고 추악합니다.

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 포함 후 명시 적으로 종료 된 임시 코어 해킹 / 코드 풀 재정의입니다. 이렇게하면 설정 리소스 스크립트가 반쯤 통과 할 가능성이 줄어 듭니다.

더 나은 솔루션이자 개인 "아마도 하루"프로젝트 중 하나는 Magento 핵심 방법을 사용하여 적용해야 할 업데이트를 검사하고, 나열하고, 사용자가 하나씩 업데이트 할 수 있도록하는 사용자 지정 스크립트입니다.


훌륭한 답변과 훌륭한 통찰력, 감사합니다; 또한 내 문제를 해결하는 방법에 대한 팁. 결과적으로 dev.-server에서 데이터베이스를 업그레이드하고 "준비된"db를 새 시스템으로 가져 왔습니다.
simonthesorcerer

2
FWIW, "아마 언젠가"프로젝트가 시스템이되었습니다 : n98-magerun magerun.net의
Alan Storm

해당 스크립트 준비 @AlanStorm를 받았을 때 알려주세요)
fkoessler

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.