gpt4 book ai didi

php - 如何将 begin-commit 事务放入 Controller : cakephp?

转载 作者:可可西里 更新时间:2023-11-01 07:41:52 24 4
gpt4 key购买 nike

我正在开发一个将更新一些表的 Controller 。我可以从我的 Controller 调用我的模型,在模型函数中我可以开始并提交我的查询,它可以在发生错误时回滚。

这是我的示例:

Controller :

//update table when update button is clicked
if (!empty($this->data)) {
if ($this->Item->update($this->data)) {
$this->Item->create();
$this->redirect('/sample');
return;
} else {
$this->set('data', $this->data);
}
}

型号:

function update($data)
{
$this->begin($this);
if(!parent::save($data)) {
$this->rollback($this);
return false;
}

$this->commit();
return true;
}

现在一切正常。但我需要做的是在我的 Controller 中调用另一个模型,如“$this->”ANOTHER MODEL HERE“->update()”。如果任一模型事务出现问题,我需要进行回滚。我在想的是在两个模型调用成功后在我的 Controller 中提交。

很像这样:

CONTROLLER PHP:
BEGIN TRANSACTION
->CALLS MODEL1
IF(MODEL1 == ERROR){
ROLLBACK
}
->CALLS MODEL2
IF(MODEL2 == ERROR){
ROLLBACK
}
COMMIT WHEN NO PROBLEM IS ENCOUNTERED

那么是否可以在controller中进行commit呢?我只能在模型中做到这一点。提前致谢!

最佳答案

So is it possible to perform commit in controller? I am only able to do it in model.

是的,您可以在 Controller 内执行提交或回滚。您需要先从您的一个模型中获取数据源。在 Controller 代码中,只需引用您正在使用的模型之一(假设它们都在同一个数据库中):

$ds = $this->MyModelName->getdatasource();

然后您可以从 Controller 内开始、提交和回滚到该数据源。

$ds->begin();

// do stuff and save data to models

if($success)
{
$ds->commit();
}
else
{
$ds->rollback();
}

如果我放弃操作并重定向或在某个步骤中完成并重定向,我实际上在多个地方有回滚或提交。我这里只是举例说明。

在 Controller 中处理事务对我来说最有意义,因为 Controller 操作是事务边界在概念上真正存在的地方。交易的想法自然会跨越多个模型的更新。我一直在使用 postgres 作为 Cake 2.2 和 2.3 的后端数据库来做这件事,它在这里工作得很好。尽管我怀疑 YMMV 与其他数据库引擎。

关于php - 如何将 begin-commit 事务放入 Controller : cakephp?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7523562/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com