php - Laravel 4.2 - 多个数据库的事务回滚问题

标签 php laravel pdo transactions

我在回滚涉及多个数据库表的事务时遇到问题。主表回滚的行为符合预期,但子行仍然存在,现在是孤立的。

public function devUserCreateTest()
{
    DB::beginTransaction();

    try {

        $childUser  = new ChildUser; // Exists in database B
        $parentUser = new User; // Exists in database A

        $parentUser->setEmailAttribute('mike@yourmomshouse.com');

        $parentUser->save();

        $childUser->parent_user_id = $parentUser->id;

        $message = sprintf('Parent user id: %s', serialize($childUser->id));

        $childUser->save();

        $message = sprintf('Core user id: %s | hta user id: %s', serialize($parentUser->id), serialize($childUser->id));

        throw new Exception('Testing....');

        DB::commit();

    } catch (Exception $e) {

        Log::warning(sprintf('Exception: %s', $e->getMessage()));

        DB::rollback();
    }

    return $this->buildResponse(array('message' => $message));
}

看起来像这样:

public function devUserCreateTest()
{
    $dboA = DB::connection();
    $dboB = DB::connection('b_database');

    $dboA->beginTransaction();
    $dboB->beginTransaction();

    try {

        $childUser  = new ChildUser; // Exists in database B
        $parentUser = new User; // Exists in database A

        $parentUser->setEmailAttribute('mike@yourmomshouse.com');

        $parentUser->save();

        $childUser->parent_user_id = $parentUser->id;

        $message = sprintf('Parent user id: %s', serialize($childUser->id));

        $childUser->save();

        $message = sprintf('Core user id: %s | hta user id: %s', serialize($parentUser->id), serialize($childUser->id));

        throw new Exception('Testing....');

        $dboA->commit();
        $dboB->commit();

    } catch (Exception $e) {

        Log::warning(sprintf('Exception: %s', $e->getMessage()));

        $dboA->rollback();
        $dboB->rollback();
    }

    return $this->buildResponse(array('message' => $message));
}

最佳答案

您还必须在数据库 B 上设置一个事务。

由于您没有发布 ChildUser 代码,这里是一个示例:

app/models/ChildUser.php :

class ChildUser extends Eloquent
{
    protected $connection = 'some_connection'; // as defined in app/config/database.php
}

然后是你的代码

public function devUserCreateTest()
{
    DB::beginTransaction();
    DB::connection('some_connection')->beginTransaction(); // same as the one used in model ChildUser

    try {

        $childUser  = new ChildUser; // Exists in database B
        $parentUser = new User; // Exists in database A
        $parentUser->setEmailAttribute('mike@example.com');
        $parentUser->save();
        $childUser->parent_user_id = $parentUser->id;
        $message = sprintf('Parent user id: %s', serialize($childUser->id));
        $childUser->save();
        $message = sprintf('Core user id: %s | hta user id: %s', serialize($parentUser->id), serialize($childUser->id));
        throw new Exception('Testing....');
        DB::commit();
    } catch (Exception $e) {
        Log::warning(sprintf('Exception: %s', $e->getMessage()));

        DB::rollback();
        DB::connection('some_connection')->rollback();
    }
    return $this->buildResponse(array('message' => $message));
}

关于php - Laravel 4.2 - 多个数据库的事务回滚问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30791760/

相关文章:

php - 迁移到新主机后无法访问 WordPress 仪表板

php - 如何使用 Laravel 5 获取 HTTP 主机

php - Laravel - 哈希器/重置密码问题

php - 如何在 Laravel 5 中使用 where 条件获取数据列表

每个带有数据库调用的 Laravel 请求的 php 执行超时

php - php 中的 cURL - 我有 2 个单独工作的函数,但当组合时,第二个函数输出第一个 cURL 调用的结果

php - 帮助MYSQL查询使用PHP搭建博客存档导航菜单

php - 如何使用 PHP session 将数据从一个文件的表单传送到另一个文件?

php - 在 MySQL 中使用绑定(bind)参数作为用户定义的变量是否安全?

php - PDO:MySQL 服务器已消失