我需要在插入数据后删除行,但是这些操作应该在一个事务中分组。
我错了还是atomic => false
param无法设置为Model::delete()
?
有什么建议吗?
答案 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将是原子事务。