我们正在使用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_user
(role_id
,user_id
)值(2 ,13))“,
答案 0 :(得分:0)
这超出了普通的Eloquent用例,而超出了普通的用例时,Eloquent会变得非常讨厌。
要解决此问题,首先,您要在主数据库上创建一个用户,并创建一个服务或存储库以在租户上创建和检索角色。
答案 1 :(得分:0)
您似乎遇到了https://github.com/laravel/framework/issues/23413中描述的问题。
不幸的是,除了删除外键之外,没有任何简单的“解决方案”,尽管,我正在探索使用PostgreSQL(而不是MySQL / MariaDB)时的解决方法,如果发现更好的方法,它将更新这篇文章。