Apakah Peningkatan Database Magento terjadi dalam "transaksi"?


12

Kami memiliki masalah ini:

Seorang klien membuat tokonya ditingkatkan dari CE 1.4 ke CE 1.8. Pemutakhiran file berjalan dengan baik, dan pemutakhiran basis data berjalan dengan baik di mesin pengembangan kami.

Ketika kami mencoba memutakhirkan live-db klien di live-machine-nya (hubungkan 1,8-Magento ke database dan buka di browser), proses tampaknya berjalan untuk sementara waktu dan berakhir pada kesalahan 500.

Log kesalahan PHP kosong; karena ini adalah host bersama, kami tidak dapat mengubah pengaturan apache atau mysql; sang hoster, meskipun "hosting khusus im magento", tidak mau mengubah pengaturan dan memberi tahu saya bahwa saya dapat menyelesaikan pemutakhiran basis data dengan berulang kali menyegarkan jendela peramban ketika kesalahan 500 terjadi, karena magento kemudian akan ditingkatkan dalam langkah-langkah kecil . Ini bisa berlangsung berjam-jam.

Pertanyaan saya sekarang adalah:
- Apakah ini benar? Saya pikir sql-statement untuk pemutakhiran basis data akan dibungkus dalam suatu transaksi, sehingga mereka dapat dikembalikan jika ada masalah.
- Bisakah jawaban memberikan petunjuk di mana saya dapat melihat kode untuk menemukan jawaban untuk pertanyaan ini?

Terima kasih atas waktunya!


2
Mungkin relevan: Perintah n98-magenrun baru yang memungkinkan Anda menjalankan skrip migrasi satu per satu. github.com/netz98/n98-magerun/pull/274
Alan Storm

Jawaban:


8

Apakah ini benar? Saya pikir sql-statement untuk pemutakhiran basis data akan dibungkus dalam suatu transaksi, sehingga mereka dapat dikembalikan jika ada masalah.

Naluri rekayasa Anda bagus, tetapi apa yang terjadi di dunia nyata pemrograman startup bisnis lebih rumit / jelek.

Sistem sumber daya pengaturan Magento tidak membungkus masing-masing skrip dalam suatu transaksi. Ada banyak alasan untuk ini, tapi saya selalu berasumsi yang utama adalah Magento mulai hidup terikat secara eksplisit dengan MySQL, dan banyak / sebagian besar pernyataan definisi data ( ALTER TABLE, dll) di MySQL menyebabkan komit implisit .

Meskipun Anda akan menemukan sumber daya pengaturan individual terkadang menggunakan transaksi.

#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
    //...    

sistem itu sendiri hanya menjalankan skrip dan berharap yang terbaik.

Jika Anda tertarik pada kode yang menjalankan sumber daya ini, tempat terbaik untuk memulai mungkin ada di sini

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

The _modifyResourceDbMetode adalah salah satu yang termasuk script sumber daya sebenarnya setup

#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;

Solusi yang sangat rumit untuk masalah Anda akan menjadi core-hack / code-pool-override sementara yang secara eksplisit keluar setelah 5-10 mencakup, dan menjalankannya kembali. Ini akan mengurangi kemungkinan skrip sumber daya pengaturan yang ditebus setengah jalan.

Solusi yang lebih baik, dan salah satu proyek "mungkin satu hari" pribadi saya akan menjadi skrip khusus yang menggunakan metode inti Magento untuk memeriksa pembaruan yang perlu diterapkan, mendaftar, dan membiarkan pengguna menjalankannya satu per satu.


Jawaban bagus & wawasan hebat, terima kasih; juga untuk tips bagaimana menyelesaikan masalah saya. Saya berakhir dengan memutakhirkan database pada dev.-server dan mengimpor "ready" db ke sistem baru.
simonthesorcerer

2
FWIW, proyek "mungkin suatu hari" menjadi sistem: setup: perintah tambahan di n98-magerun magerun.net
Alan Storm

Biarkan saya tahu ketika Anda sudah menyiapkan skrip itu @AlanStorm;)
fkoessler

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.