2013-12-17 18 views

回答

8

這是一個資源模型類(Mage_Core_Model_Resource_Transaction)。

在例如:

當你想改變的東西在一個產品,你想改變一個類別的東西你要實例化catalog/categorycatalog/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_objectMage::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(); 
} 

在這種情況下的利潤,如果出問題時,我們增加了一個或多個對象,沒有改變是發佈到數據庫。

4

不,這個模型不使用任何表格。它需要使MySQL事務功能。例如,您希望保存發票,裝運和訂單,但如果出現問題,請回滾所有以前保存的數據。您可以這樣做:

$transactionSave = Mage::getModel('core/resource_transaction') 
    ->addObject($invoice) 
    ->addObject($order) 
    ->addObject($shipment); 
$transactionSave->save(); 

事務保存方法將遍歷所有對象並調用其中的保存方法。例如,如果在裝運過程中出現問題,Magento會調用$ this - > _ rollbackTransaction();方法(類Mage_Core_Model_Resource_Transaction,第166行),並將使用MySQL功能回滾所有先前保存的數據。

如果你想調用另一個然後保存方法爲對象,你便可以調用$ transactionSave->保存()後使用addCommitCallback方法

$transaction->addCommitCallback(array($order, 'place')); 

;它會調用$ order-> place()方法。 有關更多示例,請參閱Mage_Sales_Model_Service_Quote類 - 它在很多地方使用事務保存。

相關問題