php - 如何在 Laravel Eloquent 中处理多个并发更新?

标签 php laravel concurrency eloquent

Laravel 5.5

我想知道如何正确处理不同用户或同一用户从不同页面对同一记录进行多次更新的可能情况。

例如,如果响应 Page_1 的请求从数据库中读取 Model_1 的实例,并响应 Page_2 的请求加载同一对象的副本,则如何最好地实现防止第二次更新的机制破坏第一次更新? (当然,更新可以按任何顺序发生......)。

我不知道是否可以通过 Eloquent 锁定记录(我不想使用 DB:: 进行锁定,因为您必须引用基础表和行ids),但即使这是可能的,加载页面时锁定和提交时解锁也不合适(我将省略细节)。

我认为检测先前的更新已进行并优雅地失败后续更新将是最好的方法,但我是否必须手动执行此操作,例如通过测试时间戳 (updated_at) 字段?

(我假设 Eloquent 在更新之前不会自动比较所有字段,因为如果使用文本/二进制等大字段,这会有点低效)

最佳答案

您应该看看悲观锁定,这是一种在现有更新完成之前阻止任何更新的功能。

查询构建器还包括一些函数来帮助您对 select 语句进行“悲观锁定”。要使用“共享锁”运行语句,您可以在查询上使用sharedLock 方法。共享锁可防止所选行在事务提交之前被修改:

DB::table('users')->where('votes', '>', 100)->sharedLock()->get();

或者,您可以使用 lockForUpdate 方法。 “更新”锁可防止行被修改或被另一个共享锁选择:

DB::table('users')->where('votes', '>', 100)->lockForUpdate()->get();

引用:Laravel Documentation

关于php - 如何在 Laravel Eloquent 中处理多个并发更新?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48276920/

相关文章:

php - 如果 mysql 列 =x echo 'x' 否则如果 y echo 'y'

php - 文件夹内的 CodeIgniter、NGINX 不工作

php - 转义以插入到 MySql

PHP处理并发

php - 如何从 php 中的值数组中对特定字符串进行排序?

php - MySQL 语法错误 SQL 错误 [1064] [42000] : You have an error in your SQL syntax

php - 从 laravel/php 中的 mysql 列数组值中查找单个值

mysql - 创建一个属于多于 2 个模型的关系

data-structures - 无锁队列算法,重复读取一致性

java - Java 中用于 REST 服务的异步页面等效项