记录一个问题
在ab测试工具 访问量100 并发 100 的情况下出现的问题
原本的like值为

使用
DB::table('articles')->where('id' , $request->id)->increment('like');


而使用
return DB::transaction(function() use ($request){
$article = Article::find($request->id);
$article->like += 1;
$article->save();
return $this->message('点赞成功!');
});


本作品采用《CC 协议》,转载必须注明作者和本文链接
关于 LearnKu
高认可度评论:
1.increment 方法编译后的结果就是 update like = like +1 where id = 'id',update 语句是行级锁,所有是顺序执行更新的。
2.在事务里面进行查询之后再更新,MySQL 默认使用 RR 级别隔离,所有可能存在并发请求的时候读取的值是同一个,
这里避免的方式是加上 Article::lockForUpdate()->find($request->id); 排它锁,目的是在本次事物执行查询的时候,其他事务是不允许读取的,这样才能防止并发下产生的问题。
那个177, 是 0 - 177, 还是 100 - 177
这两行代码中间,数据库里面like的值可能被其他请求修改了
1.increment 方法编译后的结果就是 update like = like +1 where id = 'id',update 语句是行级锁,所有是顺序执行更新的。
2.在事务里面进行查询之后再更新,MySQL 默认使用 RR 级别隔离,所有可能存在并发请求的时候读取的值是同一个,
这里避免的方式是加上 Article::lockForUpdate()->find($request->id); 排它锁,目的是在本次事物执行查询的时候,其他事务是不允许读取的,这样才能防止并发下产生的问题。
这是个很经典的问题,面试被问到过,实际工作中也遇到过,赞一个
我刀呢