如何在laravel中使用数据库事务进行多次连接?

时间:2019-07-16 16:26:00

标签: database laravel transactions multi-tenant

我们正在使用2个独立的连接为多个数据库开发多租户应用程序。用户模型使用主连接,而角色使用承租人连接。用户表与角色表具有多对多关系,其中枢轴表role_user具有列user_id和role_id。FKuser_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))“,

2 个答案:

答案 0 :(得分:0)

这超出了普通的Eloquent用例,而超出了普通的用例时,Eloquent会变得非常讨厌。

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

答案 1 :(得分:0)

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

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