【问题标题】:Magento multiple database transactions in single commit一次提交中的 Magento 多个数据库事务
【发布时间】:2014-12-16 10:52:23
【问题描述】:

我知道如何在zend框架中做到这一点

$db->beginTransaction();

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

但我想用 magento 模型来做,比如

$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();
}

如果其中任何一个未能保存,则应全部回滚

谢谢

【问题讨论】:

    标签: php magento zend-framework


    【解决方案1】:

    查看app/code/core/Mage/Core/Model/Resource/Transaction.php

    此模型允许在事务中添加另一个模型作为对象。在保存期间,它为每个添加的对象调用$object->save()。如果某事失败,它会调用 $object->getResource()->rollBack() 用于每个对象。您还可以通过addCommitCallback(array($object, 'callbackFunctionName')) 添加提交回调。

    如果您需要删除事务,请调用$transaction->delete() 而不是$transaction->save() 在这种情况下,它为每个对象调用$object->delete() 而不是$object->save()

    例子:

    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();
    }
    

    【讨论】:

    • 谢谢 ToxaBse,你能告诉我如果我想保存 'modulename/table1' 并更新 'modulename/table2' 并删除 'modulename/table3' ,我将如何实现?跨度>
    • 我没有在一个事务中使用保存和删除操作,而是尝试添加下一行: $transaction->addCommitCallback(array(Mage::getModel('modulename/table2'), 'delete '));
    【解决方案2】:

    对于单个事务中的 INSERT 、 DELETE 和 UPDATE (根据您的评论),请尝试以下操作,

    <?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();
    }
    

    我没有测试过这个。请自行承担风险尝试。问题是您无法在此获取所有 db-transaction 的最后一个插入 ID。 delete() 不需要调用 save()。但是 INSERT 和 UPDATE 方法你需要最后调用save()。请更新结果是否有效。

    【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-08-28
    • 2013-09-01
    • 1970-01-01
    相关资源
    最近更新 更多