select ... for update

场景:多个进程都先读后写咋办,需要的是让他们串行执行。

比如库存的减少。一般这些操作都是很长一串并且是开启事务的。如果库存刚开始读的时候是1,而立马另一个进程进行了update将库存更新为0了,而事务还没有结束,会将错的数据一直执行下去,就会有问题。所以需要for upate 进行数据加锁防止高并发时候数据出错。

特点:for update仅适用于InnoDB,且必须在事务块(BEGIN/COMMIT)中才能生效。在进行事务操作时,通过“for update”语句,MySQL会对查询结果集中每行数据都添加排他锁,其他线程对该记录的更新与删除操作都会阻塞。排他锁包含行锁、表锁。

原理: 多个进程试图通过for update给表加锁,但只有一个能获取到。那就要等待上一个 commit提交之后才能select到数据。

悲观锁

悲观锁是对数据被的修改持悲观态度(认为数据在被修改的时候一定会存在并发问题),因此在整个数据处理过程中将数据锁定。悲观锁的实现,往往依靠数据库提供的锁机制(也只有数据库层提供的锁机制才能真正保证数据访问的排他性,否则,即使在应用层中实现了加锁机制,也无法保证外部系统不会修改数据)。

项目中应用:

在砍价微服务中对 好友砍价的功能应用此悲观锁。 刚开始查询砍价分支信息,如果合法,则允许砍价,更改分支信息(其中也涉及库存数量)。这个过程中用户请求可能比较集中,就要避免高并发的问题。

点击查看代码
 public function cutBranch()
{
$branchId = ...;
try {
Db::beginTransaction();
$data = $this->bargainBranchLogic->cutBranch(branchId);
} catch (\Throwable $e) {
//...
Db::rollback();
}
Db::commit();
//...
} public function getBranchInfoForUpdate($con){
$tbName = ...;
$data = Query::table($tbName)->forUpdate()->condition($con)->one()->getResult();
var_dump(get_last_sql());
return self::format($data);
}

高并发解决方案之 mysql悲观锁:select ... for update的更多相关文章

  1. 【MySQL】MySQL悲观锁 + 事物 + for update 解决普通流量并发的问题

    使用mysql悲观锁解决并发问题   最近学习了一下数据库的悲观锁和乐观锁,根据自己的理解和网上参考资料总结如下: 悲观锁介绍(百科): 悲观锁,正如其名,它指的是对数据被外界(包括本系统当前的其他事 ...

  2. Hibernate解决高并发问题之:悲观锁 VS 乐观锁

    高并发问题是程序设计所必须要解决的问题,解决此类问题最主要的途径就是对对程序进行加锁控制.hibernate对加锁机制同样做出了实现,常用加锁方式为悲观锁和乐观锁.悲观锁指的是对数据被外界(包括本系统 ...

  3. 高并发数据库之MySql性能优化

    1.慢查询 SHOW VARIABLES LIKE '%quer%'

  4. 高并发数据库之MySql性能优化实战总结

    向MySQL发送一个请求时MySQL具体的操作过程 慢查询 1.慢查询 SHOW VARIABLES LIKE '%quer%' 索引优化技巧 1.对于创建的多列索引(复合)索引,只要查询条件使用了最 ...

  5. 《MySQL悲观锁总结和实践》乐观锁

    mysql乐观锁总结和实践 博客分类: MyBatis 数据库 mysql数据库乐观锁悲观锁 上一篇文章<MySQL悲观锁总结和实践>谈到了MySQL悲观锁,但是悲观锁并不是适用于任何场景 ...

  6. mysql悲观锁处理赠品库存超卖的情况

    处理库存超卖的情况前,先了解下什么是乐观锁和悲观锁,下面的几篇博客已经介绍的比较详细了,我就不在赘述其原理了 [MySQL]悲观锁&乐观锁 对mysql乐观锁.悲观锁.共享锁.排它锁.行锁.表 ...

  7. 关于SQL SERVER高并发解决方案

    现在大家都比较关心的问题就是在多用户高并发的情况下,如何开发系统,这对我们程序员来说,确实是值得研究,最近找工作面试时也经常被问到,其实我早有去关心和了解这类问题,但一直没有总结一下,导致面试时无法很 ...

  8. PHP面试(二):程序设计、框架基础知识、算法与数据结构、高并发解决方案类

    一.程序设计 1.设计功能系统——数据表设计.数据表创建语句.连接数据库的方式.编码能力 二.框架基础知识 1.MVC框架基本原理——原理.常见框架.单一入口的工作原理.模板引擎的理解 2.常见框架的 ...

  9. 手把手让你实现开源企业级web高并发解决方案(lvs+heartbeat+varnish+nginx+eAccelerator+memcached)

    原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 .作者信息和本声明.否则将追究法律责任.http://freeze.blog.51cto.com/1846439/677348 此文凝聚 ...

  10. java并发编程与高并发解决方案

    下面是我对java并发编程与高并发解决方案的学习总结: 1.并发编程的基础 2.线程安全—可见性和有序性 3.线程安全—原子性 4.安全发布对象—单例模式 5.不可变对象 6.线程封闭 7.线程不安全 ...

随机推荐

  1. HOLIscapes使用条款与免责协议

    HOLIscapes(以下简称"我们")在此特别提醒您务必认真阅读.充分理解本<使用条款与免责协议>(以下简称"本协议")中各条款并选择是否接受本协 ...

  2. check power supply check cpu top

    lshw -c power power supply mwh https://www.eia.gov/energyexplained/electricity/electricity-in-the-us ...

  3. 【git】2.4 撤销操作

    资料来源 (1) https://git-scm.com/book/zh/v2/Git-%E5%9F%BA%E7%A1%80-%E6%92%A4%E6%B6%88%E6%93%8D%E4%BD%9C ...

  4. docker 文件编写,和jdk11运行java的Dockerfile文件

    制作 docker文件 建立 Dockerfile 文件 拷贝jar文件到 新目录下 FROM openjdk:8 MAINTAINER TsuiChris COPY *.jar /app.jar E ...

  5. gitlab+jenkins配置自动触发构建

    1.jenkins安装gitlab插件 2.启动gitlab容器 docker run -itd -v /opt/gitlab/etc:/etc/gitlab -v /opt/gitlab/log:/ ...

  6. vue调接口导出表格

     props:{       form:{         type:Object,         default:()=>{}       },       indexNum:{       ...

  7. 微信小程序级联选择器省市区选择器部分安卓手机兼容的问题:无法只选省份,必须选择到市

    代码片段: 1 <view class="item"> 2 <view class="i-name"><text class=&q ...

  8. eggjs 在vscode调试

    https://eggjs.org/zh-cn/core/development.html?spm=ata.13261165.0.0.3c2f2be9w2ozd8#%E4%BD%BF%E7%94%A8 ...

  9. Linux中的虚拟文件系统

    VFS的概念 LINUX下的文件系统可分为三大块: ①一是上层的文件系统的调用 ②二是虚拟文件系统交换器 ③三是挂载到VFS中各实际文件系统,例如ext2,jffs. VFS确切的叫法是"V ...

  10. allure安装成功后,执行未生成报告解决

    在搜索了很多方法尝试后,执行依然没有生成测试报告,在尝试在pycharm里面修改配置解决了: file>setting>tools>Python integrated tools&g ...