9

我需要你在 CakePHP 中使用事务的帮助。

我有一个 Product 模型,带有子句 hasMany 到 Price 和 Property 模型(关键 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

4

1 回答 1

29

必须是 InnoDb 格式。MyISAM 格式的表不支持事务。

无需在模型中插入额外的代码。

产品控制器:

$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();
}
于 2013-08-03T16:06:13.760 回答