Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/database/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Database 如何在laravel中使用数据库事务进行多连接?_Database_Laravel_Transactions_Multi Tenant - Fatal编程技术网

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

Database 如何在laravel中使用数据库事务进行多连接?,database,laravel,transactions,multi-tenant,Database,Laravel,Transactions,Multi Tenant,我们正在开发一个多租户应用程序,为多个数据库使用两个单独的连接。用户模型使用主连接,角色使用租户连接。users表与roles表具有多对多关系,其中pivot表Role_User具有User_id和Role_id列。FK User_id引用主数据库中的users表。在user::create()和$newuser->roles->sync()上使用db事务;抛出错误。如何在多租户系统中实现数据库事务。感谢您的帮助 class User extends Authenticatable implem

我们正在开发一个多租户应用程序,为多个数据库使用两个单独的连接。用户模型使用主连接,角色使用租户连接。users表与roles表具有多对多关系,其中pivot表Role_User具有User_id和Role_id列。FK User_id引用主数据库中的users表。在user::create()和$newuser->roles->sync()上使用db事务;抛出错误。如何在多租户系统中实现数据库事务。感谢您的帮助

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:insert into
role\u user
role\u id
user\u id
)值(2,13)),

这是超出正常雄辩用例的部分,当您超出正常用例时,雄辩会变得非常糟糕


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

您似乎遇到了中描述的问题


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

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