在Magento的核心代码Mage::getModel('core/resource_transaction')
中,这个模型做了什么以及在什么情况下我们想要启动和使用这个核心模型类?该模型在Magento数据库中是否有相应的表?
答案 0 :(得分:10)
这是一个资源Model类(Mage_Core_Model_Resource_Transaction
)。
例如:
当您想要更改产品中的某些内容并且想要更改某个类别中的某些内容时,您将要实例化catalog/category
和catalog/product
。并按照以下方式进行更改:
$prod_id = 554;
$cat_id = 323;
$product_object = Mage::getModel('catalog/product')->load($prod_id);
$product_object->setName('NewProductName');
try{
$product_object->save();
echo "Transaction for PRODUCT completed successfully";
} catch(EXCEPTION $e) {
echo $e->getMessage();
}
$category_object = Mage::getModel('catalog/category')->load($cat_id);
$category_object->setName('NewCatName');
try{
$category_object->save();
echo "Transaction for Category completed successfully";
} catch(EXCEPTION $e) {
echo $e->getMessage();
}
正如您在上面的代码中看到的,我们save()
2次。一个用于产品,一个用于类别。捕获2个不同的异常,以及2个不同的事务到数据库。
在某些情况下(我认为很少见)需要使用2个或更多对象进行更改,并在单个事务中保存到数据库中。
因此,在我们的案例中,我们将$product_object
和$category_object
添加到Mage::getModel('core/resource_transaction')
个实例中:
$one_transaction = Mage::getModel('core/resource_transaction');
$one_transaction->addObject($product_object);
$one_transaction->addObject($category_object);
try{
$one_transaction->save();
} catch(EXCEPTION $e) {
echo $e->getMessage();
}
在这种情况下的利润是,如果我们添加的一个或多个对象出现问题,没有更改会发布到数据库。
答案 1 :(得分:4)
不,此型号不使用任何表格。需要使MySQL事务功能化。例如,您希望保存发票,发货和订单,但如果出现问题,则回滚所有以前保存的数据。你可以这样做:
$transactionSave = Mage::getModel('core/resource_transaction')
->addObject($invoice)
->addObject($order)
->addObject($shipment);
$transactionSave->save();
事务保存方法将遍历所有对象并在其中调用save方法。如果在发货保存期间出现问题,例如,Magento将调用$ this-> _rollbackTransaction();方法(类Mage_Core_Model_Resource_Transaction,第166行),并将使用MySQL功能回滚所有以前保存的数据。
如果要为对象调用另一个然后保存方法,可以使用addCommitCallback方法
$transaction->addCommitCallback(array($order, 'place'));
然后调用$ transactionSave-> save();它将调用$ order-> place()方法。 有关更多示例,请转到类Mage_Sales_Model_Service_Quote类 - 它在许多地方使用事务保存。