gpt4 book ai didi

php - 交易不适用于子功能

转载 作者:塔克拉玛干 更新时间:2023-11-03 05:43:30 27 4
gpt4 key购买 nike

我在 Laravel 中使用了 DB::beginTransaction(),但它仅适用于在主函数中完成的数据库更改,不适用于子函数。

主要功能代码:

try {
DB::beginTransaction();
$data = array(
'id' => Input::get('id'),
'task_title' => Input::get('task_title'),
);
DB::table('task')->insert($data);
$id = DB::getPdo()->lastInsertId();

// Add Actionees
if (!$this->addActionees(Input::get('actionees'), $id)) {
DB::rollback();
return Response::json(false);
}
DB::commit();
return Response::json(true);
} catch (Exception $ex) {
DB::rollback();
return Response::json($ex);
}

子函数代码:

private function addActionees($actionees, $id, $status) {
try {
DB::table('task_assignee_user')->where('task_id', $id)->delete();
foreach ($actionees as $act) {
$actAdd = array(
'task_id' => $id,
'user_id' => $act->user_id,
);
DB::table('task_assignee')->insert($actAdd);
}
return True;
} catch (Exception $ex) {
return FALSE;
}
}

因此在上面的示例中,在函数 addActionees() 下所做的更改不会回滚,在函数 addActionees() 中,所有针对 ID 的记录将在插入新记录之前删除.如果发现异常,那么我想恢复这些更改。

最佳答案

您不应该在 addActionees() 方法中捕获异常。只要让它抛出,外部的 try-catch block 就会处理它:

主要功能代码:

try {
DB::beginTransaction();
$data = array(
'id' => Input::get('id'),
'task_title' => Input::get('task_title'),
);
DB::table('task')->insert($data);
$id = DB::getPdo()->lastInsertId();

// Add Actionees
$this->addActionees(Input::get('actionees'), $id);
DB::commit();
return Response::json(true);
} catch (Exception $ex) {
DB::rollback();
return Response::json($ex);
}

子功能代码:

private function addActionees($actionees, $id, $status) {
DB::table('task_assignee_user')->where('task_id', $id)->delete();
foreach ($actionees as $act) {
$actAdd = array(
'task_id' => $id,
'user_id' => $act->user_id,
);
DB::table('task_assignee')->insert($actAdd);
}
}

关于php - 交易不适用于子功能,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45439035/

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