2013-08-03 64 views
5

我需要您在CakePHP中使用事務的幫助。CakePHP 2.3.x數據庫事務

我有一個產品模型,子句hasMany到價格和屬性模型(關鍵product_id)。

在我的產品型號,我加

function begin() { 
    $db =& ConnectionManager::getDataSource($this->useDbConfig); 
    $db->begin($this); 
} 

function commit() { 
    $db =& ConnectionManager::getDataSource($this->useDbConfig); 
    $db->commit($this); 
} 
function rollback() 
{ 
    $db =& ConnectionManager::getDataSource($this->useDbConfig); 
    $db->rollback($this); 
} 

而在ProductController的我用的save()來保存我的產品,然後我的價格和性能。 (我只使用save(),而不是saveAll())。

我的代碼是:

$this->Product->begin(); 
$error = false; 
if($this->Product->save($data) 
{ 
    //my functions and calculations 
    if(!$this->Price->save($data_one) 
    { 
     $error = true; 
    } 
    //calculations 
    if(!$this>Property->save($my_data) 
    { 
     $error = true; 
    } 
} 
if($error) { 
    $this->Product->rollback(); 
} 
else 
{ 
    $this->Product->commit(); 
} 

的問題是,如果我有折扣價格或屬性行內的錯誤,產品還加入。我會想,當我有任何錯誤時,我的行都不會被添加(即回滾會刪除它)。

我使用CakePHP 2.3.8

回答

22

必須是InnoDB的格式。 MyISAM格式的表格不支持事務處理。

無需在模型中插入額外的代碼。

ProductController的:

$datasource = $this->Product->getDataSource(); 
try { 
    $datasource->begin(); 
    if(!$this->Product->save($data) 
     throw new Exception(); 

    if(!$this->Price->save($data_one) 
     throw new Exception(); 

    if(!$this->Property->save($my_data) 
     throw new Exception(); 

    $datasource->commit(); 
} catch(Exception $e) { 
    $datasource->rollback(); 
} 
+0

喜,不過,MySQL支持InnoDB表和交易 http://dev.mysql.com/doc/refman/5.0/en/commit.html –

+0

@MarceloAymone:在這種上下文中,他的意思是** MyISAM **。這必須被稱爲'**引擎**',而不是'格式'! – Tuanitim

+0

交易未在InnoDb表中自動使用嗎? –