Php Laravel-停止对记录的并发访问
在Laravel中,是否有任何方法可以停止同时与同一记录交互。例如,如果用户A正在编辑一条记录,那么同时我需要阻止用户B编辑同一条记录 注意:我正在使用SESSION\u DRIVER=file&Laravel 5.2Php Laravel-停止对记录的并发访问,php,laravel,concurrency,laravel-session,Php,Laravel,Concurrency,Laravel Session,在Laravel中,是否有任何方法可以停止同时与同一记录交互。例如,如果用户A正在编辑一条记录,那么同时我需要阻止用户B编辑同一条记录 注意:我正在使用SESSION\u DRIVER=file&Laravel 5.2 目前大约有500多名用户在使用该系统,这是一种管理员面板,管理员在其中与记录交互,但我需要停止并发访问。最佳解决方案是什么 您需要在表和相应的模型属性中添加一个名为likeediting的列 检查editing是否为false,然后让用户进行编辑 在任何用户编辑中将其值更改为tr
目前大约有500多名用户在使用该系统,这是一种管理员面板,管理员在其中与记录交互,但我需要停止并发访问。最佳解决方案是什么 您需要在表和相应的模型属性中添加一个名为like
editing
的列
检查editing
是否为false
,然后让用户进行编辑
在任何用户编辑中将其值更改为true时,您需要向表和相应的模型属性添加一个名为like
editing
的列
检查editing
是否为false
,然后让用户进行编辑
在任何用户编辑中将其值更改为true时,我最近实现了类似的功能 对于每个相关表,添加一个名为“lock”的列,类型为“dateTime”,如下所示:
$table->dateTime('lock')->nullable();
现在转到控制器并找到“编辑”方法。在这里,您必须检查是否设置了“锁定”。如果是,您必须检查它是否早于(比如)15分钟(这很重要,因为如果用户在不更新记录的情况下退出页面,它将永远被锁定)。可以这样编码:
$sample = $this->sampleRepository->getById($idsample);
if (!$sample->lock || (strtotime($sample->lock) < strtotime('-15minutes'))) {
// Ok he can access the record
} else {
// He can not access the record
}
现在一次只有一个用户可以编辑一条记录
您还可以创建“强制解锁”方法,用户无需等待15分钟即可重置“锁定”
这是一个简单的实现。它与javascript配合使用效果更好,因为您可以实时检查是否有人在编辑记录。我最近实现了类似的功能 对于每个相关表,添加一个名为“lock”的列,类型为“dateTime”,如下所示:
$table->dateTime('lock')->nullable();
现在转到控制器并找到“编辑”方法。在这里,您必须检查是否设置了“锁定”。如果是,您必须检查它是否早于(比如)15分钟(这很重要,因为如果用户在不更新记录的情况下退出页面,它将永远被锁定)。可以这样编码:
$sample = $this->sampleRepository->getById($idsample);
if (!$sample->lock || (strtotime($sample->lock) < strtotime('-15minutes'))) {
// Ok he can access the record
} else {
// He can not access the record
}
现在一次只有一个用户可以编辑一条记录
您还可以创建“强制解锁”方法,用户无需等待15分钟即可重置“锁定”
这是一个简单的实现。使用javascript时效果更好,因为你可以实时检查是否有人在编辑记录。我也做过类似的事情,但当用户发送“put”时,首先检查数据是否没有被其他人同时更改,如果没有-更新,其他人返回信息和新数据
您可以只检查“更新日期”,或检查所有数据。我也做过类似的事情,但当用户发送“放置”时,首先检查数据是否在同一时间被其他人更改,如果没有-更新,则返回信息和新数据
您只能检查“更新日期”,或检查所有数据。以下是我如何做到这一点的 1) 创建一个迁移,在模型中添加两列
is\u editing
和editing\u by
和updated\u at
(如果已经存在,则无需在处创建更新)
2) 制作中间件php工匠制作:中间件停止ConcurrentOperations
3) 在$routeMiddleware
下的app/Http/Kernel.php
中注册中间件
4) 将中间件应用于控制器
$this->middleware('concurrent.operations',[“only”=>[“edit”,“update”]]);
5) 中间件中的块并发编辑
以下是我如何做到这一点的
1) 创建一个迁移,在模型中添加两列is\u editing
和editing\u by
和updated\u at
(如果已经存在,则无需在
处创建更新)
2) 制作中间件php工匠制作:中间件停止ConcurrentOperations
3) 在$routeMiddleware
下的app/Http/Kernel.php
中注册中间件
4) 将中间件应用于控制器
$this->middleware('concurrent.operations',[“only”=>[“edit”,“update”]]);
5) 中间件中的块并发编辑
并发访问问题可以用比锁定字段更简单、更有效的方式解决:
将默认值为0的version
字段添加到表迁移中
$table->smallInteger('version')->默认值(0)代码>
version
值将在每次成功的更新操作中递增
如果更新记录的版本
值不等于存储记录的版本值,则更新操作将不会成功
示例-两个用户试图更新产品记录,因此向您的应用程序发送编辑请求:
应用程序向每个用户发送一个产品实例,其版本值为0
第一个用户首先完成更新,并向您的应用程序发送一个更新请求,请求中包含请求正文中的产品字段,包括版本
值0
应用程序检查收到的版本值是否等于数据库中存储的值
值都是0,因此第一个用户成功更新了产品,应用程序增加了版本值,因此现在它是1
第二个用户完成更新,并发送更新请求
应用程序检查收到的版本值(0)是否等于数据库中存储的值(1)
操作失败,因为值为“否”
public function update(Request $request, $id)
{
// request validation here
$product = Product::find($id);
if ($request->version == $product->version) {
// update here
$product->version = $product->version + 1;
$product->save();
return response()->json("product updated successfully!", 200);
}
return response()->json("concurrent access: the product has been updated by another user!", 400);
}