Php Laravel-停止对记录的并发访问

Php 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

在Laravel中,是否有任何方法可以停止同时与同一记录交互。例如,如果用户A正在编辑一条记录,那么同时我需要阻止用户B编辑同一条记录

注意:我正在使用SESSION\u DRIVER=file&Laravel 5.2


目前大约有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);
    }