2014-12-16 8 views
5

so come farlo in Zend FrameworkMagento transazioni di database multipli in un'unica commettono

$db->beginTransaction(); 

try { 
    $db->query(...); 
    $db->query(...); 
    $db->query(...); 
    . 
    . 
    . 
    $db->commit(); 
} catch (Exception $e) { 
    $db->rollBack(); 
} 

ma io voglio farlo utilizzando il modello Magento, qualcosa come

$db->beginTransaction(); 

try { 
    $modelOne = Mage::getModel('modulename/table1'); 
    $modelTwo = Mage::getModel('modulename/table2'); 
    $modelThree = Mage::getModel('modulename/table3'); 

    $db->query($modelOne); 
    $db->query($modelTwo); 
    $db->query($modelThree); 
    . 
    . 
    . 
    $db->commit(); 
} catch (Exception $e) { 
    $db->rollBack(); 
} 

Se qualcuno di loro non è riuscito per salvare allora tutto dovrebbe essere rotolato indietro

Grazie

risposta

5

Guarda app/code/core/Mage/core/Mod el/Resource/Transaction.php

Questo modello consente di aggiungere un altro modello come oggetto nella transazione. Durante il salvataggio chiama $object->save() per ogni oggetto aggiunto. Se qualcosa non funziona, chiama $object->getResource()->rollBack() per ogni oggetto. È inoltre possibile aggiungere le richiamate di commit tramite addCommitCallback(array($object, 'callbackFunctionName')).

Se avete bisogno di cancellare transazione, chiamare $transaction->delete() invece di $transaction->save() In questo caso si chiama $object->delete() invece di $object->save() per ogni oggetto.

Esempio:

try { 
    $transaction = Mage::getModel('core/resource_transaction') 
          ->addObject(Mage::getModel('modulename/table1')) 
          ->addObject(Mage::getModel('modulename/table2')) 
          ->addObject(Mage::getModel('modulename/table3')); 

    $transaction->save(); 
} catch (Exception $e) { 
    echo $e->getMessage(); 
} 
+0

Grazie a ToxaBse, puoi anche dire cosa succede se voglio salvare 'nomemodulo/tabella1' e aggiornare 'nomocodice/tabella2' ed eliminare 'nomocompatibile/tabella3', come potrò conseguirlo? – Ahmed

+0

Non ho usato salvare ed eliminare azioni in una transazione, ma provo ad aggiungere la riga successiva: $ transaction-> addCommitCallback (array (Mage :: getModel ('nomocodice/tabella2'), 'cancella')); – ToxaBes

1

Per inserire, eliminare e UPDATE in una singola transazione (come per il tuo commento) cercano di seguito,

<?php 

$id1 = 1; //update id 
$id2 = 2; //delete id 
$data = array('title'=>'New Title','content'=>'Hello, there..!','status'=>1); 
$update = array('title'=>'My title', 'content'=>'Hi, there..!', 'status'=>1); 

try { 
    $transaction = Mage::getModel('core/resource_transaction') 
          ->addObject(Mage::getModel('modulename/table1')->load($id1)->addData($update)); 
          ->addObject(Mage::getModel('modulename/table2')->setId($id2)->delete()); 
          ->addObject(Mage::getModel('modulename/table3')->setData($data)); 

    $transaction->save(); 
} catch (Exception $e) { 
    echo $e->getMessage(); 
} 

non ho testato questo. Prova solo a tuo rischio. Il problema è che non puoi ottenere l'ultimo ID di inserimento per tutte le transazioni db in questo. Lo delete() non è obbligato a chiamare save(). Ma il metodo INSERT e UPDATE è necessario chiamare lo save() infine. Si prega di aggiornare il risultato è che funziona o no.

+0

Questo non ha funzionato per me. C'è una risposta simile (ma efficace) da @benmarks a una domanda simile su http://stackoverflow.com/questions/13478840/how-to-save-and-delete-in-same-transaction –