【问题标题】:how to use database transaction for multiple connection in laravel?如何在 laravel 中使用数据库事务进行多个连接?
【发布时间】:2019-11-25 10:52:24
【问题描述】:

我们正在开发一个多租户应用程序,使用 2 个独立的连接连接多个数据库。用户模型使用主连接,角色使用租户连接。用户表与角色表具有多对多关系,其中透视表 role_user 具有列 user_id 和 role_id .FK user_id 引用主数据库中的用户表。在 user::create() 和 $newuser->roles->sync() 上使用数据库事务;抛出错误。如何在多租户系统中实现数据库事务。任何帮助表示赞赏。

class User extends Authenticatable implements JWTSubject
{   
    use Notifiable;

    //use main connection
    protected $connection = 'main';

     public function roles()
    {
        return $this->belongsToMany('App\Models\Tenant\Role');
    }
}


class Role extends Model
{
     protected $connection = 'tenant';
}

//in UserController.php
 DB::beginTransaction();

        try {
            $newUser = User::create([
                'name' => $request->name,
                'email' =>  $request->email,
                'password' => $request->password
            ]);

            $rolesArray =  $request->roles;
            $newUser->roles()->sync($rolesArray);

           DB::commit();

            return response()->json(['status' => true, 'message' => 'successfull!!']);
        } catch (Exception $e) {
            DB::rollBack();
            return response()->json(['status' => false, 'message' => 'internal Server Error!!']);
        }

错误消息:“SQLSTATE[HY000]:一般错误:1205 超过锁定等待超时;尝试重新启动事务(SQL:插入role_userrole_iduser_id)值(2、13))”,

【问题讨论】:

  • 您的数据库系统是否支持跨多个数据库的事务?根据您的设置,这可能是 Laravel 范围之外的问题。

标签: database laravel transactions multi-tenant


【解决方案1】:

您似乎遇到了https://github.com/laravel/framework/issues/23413 中描述的问题。

不幸的是,除了删除外键之外,没有简单的“解决方案”,不过,我正在探索使用 PostgreSQL(而不是 MySQL/MariaDB)时的解决方法,如果我发现更好的方法,我会更新这篇文章。

【讨论】:

    【解决方案2】:

    这超出了正常的 Eloquent 用例,当你超出正常的用例时,Eloquent 会变得非常讨厌。

    要解决这个问题,首先您要在主数据库上创建一个用户并创建一个服务或存储库来创建和检索租户上的角色。

    【讨论】:

      猜你喜欢
      • 2014-10-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-03-22
      • 1970-01-01
      • 1970-01-01
      • 2022-10-14
      • 2019-12-16
      相关资源
      最近更新 更多