gpt4 book ai didi

php - 包装使用事务的类方法

转载 作者:可可西里 更新时间:2023-11-01 08:40:01 27 4
gpt4 key购买 nike

我有多个类方法,如果抛出异常,每个方法都使用事务和回滚。下面的基本示例。

class TaskMapper
{
private $dblayer;

public function __construct(PDO $dblayer)
{
$this->dblayer = $dblayer;
}

public function save(Task $task)
{
try {
$this->dblayer->beginTransaction();

$stmt = ... // query/queries here
$stmt->execute();

$stmt2 = ... // query/queries here
$stmt2->execute();

$this->dblayer->commit();

} catch (\PDOException $e) {

$this->dblayer->rollBack();
// deal with exception here
}


}

public function editField($id, $field, $value)
{
try {
$this->dblayer->beginTransaction();

$stmt = ... // query/queries here
$stmt->execute();

$stmt2 = ... // query/queries here
$stmt2->execute();

$stmt->execute();

$this->dblayer->commit();

} catch (\PDOException $e) {

$this->dblayer->rollBack();
// deal with exception here
}
}

}

现在,我正在为 cron 作业编写一个脚本,该作业使用包含与上述代码类似的多个类方法 - 具有事务和回滚以及异常。

例如:

if (date('j') == '1') {
// reset monthly count column
$task->editField(17, 'monthly_count', '0');
}
$task->save($task);

这是一个非常精简的示例,但我想知道是否可以将所有方法调用包装在一个 try/catch block 中的单个事务中,并在 catch 中回滚?因此,将上面的代码包装在一个带有事务的 try/catch 中,并在 catch 中回滚?

如果不是,处理这种情况的最佳方法是什么,如果一个方法调用失败,其他方法必须回滚。

提前致谢。

最佳答案

我宁愿添加一个答案,因为评论太短无法解释。

基本上,您有两种方法可以在应用程序的单个事务中包含多个操作。

  1. 调用启动事务的方法。随后的每个方法调用、属性更改都会导致数据库发生更改。这些操作期间的任何错误都将导致回滚。最后,您调用另一个方法来提交整个事务。

  2. 每次方法调用、属性更改只会更改 php 对象状态,因此数据库不会更改。在您对所有更改感到满意之后,您调用一个方法,该方法将所有 更改保存到数据库中。回滚/提交也在此调用中执行。

Mysql不支持嵌套事务,所以要么你结合使用第一种方法PDO:inTransaction正如@YourCommonSense 还建议在调用 editField() 之前启动事务,或者您必须从 editField() 和类似调用中取出数据库修改代码并仅使用 save()。

关于php - 包装使用事务的类方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35508451/

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