首页 > 数据库 >laravel 通过事务处理两个并发请求同时更新同一条 MySQL 数据

laravel 通过事务处理两个并发请求同时更新同一条 MySQL 数据

时间:2023-09-08 22:22:27浏览次数:36  
标签:laravel 请求 no 事务处理 content 并发 params 更新 MySQL

在处理两个并发请求同时更新同一条 MySQL 数据的情况时,你需要考虑并发冲突的问题,以确保数据的一致性和完整性。以下是一些解决方法:

在 Laravel 中,你可以使用数据库事务来处理并发更新。在事务中,你可以执行一系列操作,并在操作完成后提交或回滚事务。如果两个请求同时尝试更新相同的数据,一个请求会等待另一个请求完成后再执行。

use Illuminate\Support\Facades\DB;

public function syncNo(array $params)
{
    DB::transaction(function () use ($params) {
        // 锁定记录以防止其他请求同时更新
        $collection = TestModel::where(['no' => $params['no']])
            ->lockForUpdate()
            ->first();

        if (empty($collection)) {
            return;
        }

        if (empty($collection->content)) {
            $upd = ['content' => $params['content']];
        } else {
            $upd = ['content' => DB::raw("CONCAT(content, ',{$params['content']}')")];
        }

        Requisition::where('no', $params['no'])
            ->update($upd);
    });
}

当一个请求使用 lockForUpdate 锁定记录时,其他并发请求将被阻塞,直到锁被释放。这意味着在并发情况下,第一个请求成功执行 lockForUpdate 后,第二个请求将等待锁被释放,而不会立即执行。

这是为了确保数据的一致性和完整性。当多个请求试图同时修改同一行数据时,使用锁定可以防止数据不一致或错误的更新。只有当第一个请求完成并释放锁时,其他等待的请求才会被执行。

所以,第二个请求会等待第一个请求完成后才会执行。这种行为是为了避免并发冲突和保障数据的一致性。

标签:laravel,请求,no,事务处理,content,并发,params,更新,MySQL
From: https://www.cnblogs.com/pine007/p/17688660.html

相关文章

  • MySQL查询命令练习(一)
    如果需要详细的命令总结在我--软件测试--个人分类里,不想翻阅的话点这个连接也可以哈《MySQL命令总结》https://blog.51cto.com/u_16239770/7383954添加记录语法格式--指定列插入数据INSERTINTO表名(列名1,列名2)VALUES(列值1,列值2);--全部列插入数据 INSERTINTO表名VALUE......
  • mysql create procedure with in parameters ,call procedure
    //createprocedurestatementdelimiter$$usedb$$dropprocedureifexistsinsertIntoT1Table;createprocedureinsertIntoT1Table(innumint)begindeclareiintdefault1;while(i<num)doinsertintot1(name,abstract,author,content,summary)values(uui......
  • MySQL事务及常见存储引擎
    一、事务的四特性事务:transaction一个数据库事务由一条或者多条可发生事务的SQL语句构成,它们形成一个逻辑的工作单元。这些SQL语句要么全部执行成功,要么全部执行失败 原子性(Atomicity)A   事务的原子性是指事务中包含的所有操作要么完成(提交),要么不做(回滚),也就是说所有的活动......
  • XP系统无法访问Mysql 8.0.32数据库的问题
    之前一个项目,客户那边突然反应软件的数据库都访问不了了。这之前他们升级过MYSQL数据库的版本,更新到了最新的版本。我们的应用,因为需要兼容XP系统,所以当时用的是.NETFramework4.0。MySQL的驱动库在6.9.12之后就不支持.NET4.0了。所以我们用的MySQL库是6.9.12的,这个版本的库......
  • MySQL 中给用户设定有限的表访问权限
    在MySQL中可以给用户创建单独的权限,限制访问所有表,借此提高数据库的安全。如下图示例所示。其创建了一个新用户,并把他的权限限制为:1.仅允许通过localhost登录;2.只具备fsdb3数据库相关表的SELECT权限;3.数据库中可能有很多表,只有id,stat,hist,urole,udept等表是能够......
  • linux下mysql升级
    在Ubuntu/Debian、CentOS/RHEL系统上,你可以使用不同的命令来查看Linux系统的版本信息。1.查看Ubuntu/Debian版本:```lsb_release-a```或者```cat/etc/os-release```这些命令将输出包含系统版本信息的文本,其中包括发行版名称、发行版版本和系统......
  • mysql explain
    MYSQLExplain解析explain说明用于查看sql语句都执行计划,可以看到sql语句都执行了哪些索引,以及执行的顺序等等。主要作用是优化sql语句,提高sql语句的执行效率。|id|select_type|table|type|possible_keys|key|key_len|ref|rows|Extra|idse......
  • MySQL面试题
    1、MySQL的复制原理以及流程(1)、复制基本原理流程主:binlog线程——记录下所有改变了数据库数据的语句,放进master上的binlog中;2.从:io线程——在使用startslave之后,负责从master上拉取binlog内容,放进自己的relaylog中;3.从:sql执行线程——执行relaylog中的语句;(2)、MyS......
  • MySQL group_concat() 函数用法
    MySQLgroup_concat()函数用法在使用groupby对数据进行分组后,如果需要对select的数据项进行字符串拼接,这时就需要用到group_concat()函数。1、基本用法group_concat()完整语法如下:group_concat([DISTINCT]要连接的字段[OrderBY排序字段ASC/DESC][Separator'分......
  • Mac 终端登陆MySQL出现“zsh:command not found: mysql”的问题
    mysql明明安装好了,而且也登陆使用过了,但是这次在终端登陆却报错这个问题。其实上次也报错这个一样的问题,我觉得可能是环境配置没有弄好,重新检查和source生效了下(source~/.bash_profile),此时mysql能正常登陆了;但是退出终端后再次登陆又会报同样的问题。感觉不对劲了,只能生效一次......