CakePHP 2.6在事务中删除

时间:2015-04-14 12:08:11

标签: cakephp transactions

我需要在插入数据后删除行,但是这些操作应该在一个事务中分组。

我错了还是atomic => false param无法设置为Model::delete()

有什么建议吗?

3 个答案:

答案 0 :(得分:3)

您可以将删除和插入语句放入transaction。您可以构建检查以查看删除和插入是否都成功,如果不是,则回滚事务。所以你最终会在你的模型中得到这样的东西:

public function deleteAndInsert($deleteId, $newData) {
    $dataSource = $this->getDataSource();
    $dataSource->begin();

    if (!$this->delete($deleteId)) {
        // The delete failed, rollback
        $dataSource->rollback();
        return false;
    }

    if (!$this->save($newData)) {
        // The save failed, rollback
        $dataSource->rollback();
        return false;
    }

    // Everything seems to be fine, commit the transaction
    $dataSource->commit();
    return true;
}

答案 1 :(得分:2)

我会扩展Oldskools的答案。虽然它可以正常工作,但它并没有给你很多机会报告错误发生的位置,或者在返回一般错误值之前让你选择撤消其他可能的东西。我会在这里实现一些异常处理,然后你会有更多选择来处理失败。

public function deleteAndInsert($deleteId, $newData) {
    $dataSource = $this->getDataSource();

    try {
        $dataSource->begin();

        if (!$this->delete($deleteId)) {
           throw new Exception('Error deleting ID');
        }

        if (!$this->save($newData)) {
            throw new Exception('Error Storing new data');
        }

        $dataSource->commit();
        return 'Action completed successfully';

    }catch(Exception $e){
        $dataSource->rollback();
        return $e->getMessage();
    }
}

答案 2 :(得分:0)

我知道已经有很长时间了,但是...尽管确实不支持group_vars选项,但是'atomic'似乎并不意味着要提交,因此实际上不需要如实例所示。 我还相信,先前的答案之所以有效,是因为它们只涉及一个模型(没有关联)。 没有:

Model::delete()

关联模型的INSERT和UPDATE将是原子事务。