【原文】https://www.toutiao.com/i6595305814087434760/

悲观锁中的排它锁。

  1. 排它锁关键字:for update
  2. 特点:会锁住行或者表,防止其他事务进行修改操作或者获取锁操作。

详见:步步揭秘:MySQL共享锁的特性-2

解决办法

该解决办法就是通过排它锁:for update进行操作

上述SQL可以通过下图进行展现:

  1. 线程1:在A时刻开始事务,并将goods_id为1的那一行锁住(行锁),然后进行查询,获取库存。
  2. 线程2:在B时刻也想进行同样的操作,先是开启事务,然后通过同样的SQL语句尝试获取goods_id为1的行锁。显然此时线程2不会成功,因为线程一在A时刻先对此行上了锁,线程2此时只能等待,等到线程1提交事务释放锁。

3.线程1:在A到D的这段时间里独占一行,进行操作;线程2因为无法获取到锁,所以只能 在B到D这段时间内进行阻塞等待。

4.线程1:在D时刻提交事务,释放了锁。

5.线程2:在C时刻重新获取此行的锁,然后进行后续操作,直到E时刻释放锁。

总结

减库存操作前,在查询的时候通过for update将需要操作的列锁住,直到当前线程操作完成,将事务提交后,其他线程的事务才能接着进行操作。

这就是一种独占思维:每一次只允许一个线程进行操作,其他想操作的线程,必须等我处理完后才能进行处理。

老样子,我在这里留点思考题,感兴趣的同学可以在评论区谈谈想法:

  1. 悲观锁有2种:排他锁和共享锁,本文是通过排它锁来防止超卖的,可以通过共享锁来实现防止超吗?
  2. 除了在数据库中通过悲观锁保证同一时间只有一个线程对某个资源进行操作,还有其他办法实现这样的功能吗?

【转】Mysql学习---MySQL悲观锁中的排它锁的更多相关文章

  1. mysql 学习日记 悲观和乐观锁

    理解  悲观锁就是什么事情都是需要小心翼翼,生怕弄错了出大问题, 一般情况下 "增删改" 都是有事务在进行操作的,但是 "查" 是不需要事务操作的, 但是凡事没 ...

  2. 【mysql】关于悲观锁

    关于mysql中的锁 在并发环境下,有可能会出现脏读(Dirty Read).不可重复读(Unrepeatable Read). 幻读(Phantom Read).更新丢失(Lost update)等 ...

  3. mysql(for update)悲观锁总结与实践

    悲观锁,正如其名,它指的是对数据被外界(包括本系统当前的其他事务,以及来自外部系统的事务处理)修改持保守态度,因此,在整个数据处理过程中,将数据处于锁定状态.悲观锁的实现,往往依靠数据库提供的锁机制( ...

  4. MySQl学习-——Mysql体系结构与Mysql存储引擎

    Mysql体系结构与Mysql存储引擎 Mysql体系结构 mysql体系结构图:

  5. php+redis 学习 二 悲观锁

    <?php header('content-type:text/html;chaeset=utf-8'); /** * redis实战 * * 实现悲观锁机制 * */ $timeout = 5 ...

  6. mysql悲观锁中的共享锁和排他锁

    概述: 共享锁又称为读锁,简称S锁,顾名思义,共享锁就是多个事务对于同一数据可以共享一把锁,都能访问到数据,但是只能读不能修改. 排他锁又称为写锁,简称X锁,顾名思义,排他锁就是不能与其他所并存,如一 ...

  7. MySQL学习笔记:计算机服务中找不到MySQL服务

    不知道什么原因,连接了远程服务器之后,本地服务就连接不上. 经排查,发现服务中的MySQL服务居然不见,一番搜索之后,在CMD中进入到MySQL安装目录的bin下执行以下语句: mysqld.exe ...

  8. mysql学习笔记(编辑中)

    1.LAST_INSERT_ID()依赖于当前服务器会话中自动产生的序列编号.同时括号中也可以赋值更新数据,eg: update test set id = last_insert_id(id+10) ...

  9. MySQL学习之路3-MySQL中常用数据类型

    MySQL中常用数据类型 字符型 存储字符型数据.例如姓名,地址,电话号码等.使用引号括起来,一般使用单引号. 常用类型: char(255) 定长字符串,最大长度255个字符. varchar(25 ...

随机推荐

  1. INTEST/EXTEST SCAN 的学习

    intest scan的一些基本知识.INTEST scan指的是对IP 内部的scan cell的扫描测试,针对IP内部的flip-flop进行shift/capture的操作.和INTEST SC ...

  2. Docker Swarm 日常运维命令笔记

    之前介绍了Docker管理工具-Swarm部署记录,这里简单总结下Docker Swarm的日常维护命令,以作为平时运维笔记. Swarm作为一个管理Docker集群的工具,首先需要将其部署起来,可以 ...

  3. 上传文件限制导致413-Request Entity Too Large

    在使用Nginx时,在异步上传图片到服务器时,发现抛出“error”错误,仔细发现抛出错误内容为:413-Request Entity Too Large,查看Tomcat运行日志时发现后台没有接收到 ...

  4. springMVC实现 MultipartFile 多文件上传

    1.Maven引入所需的 jar 包(或自行下载) <dependency> <groupId>commons-io</groupId> <artifactI ...

  5. git使用总结(包含git commit message 和 changelog 工具的介绍)

    [git的配置] 1.配置用户名和邮箱: 分为全局配置和局部配置 --system 系统配置  --global 全局配置    --local 局部配置 Git读取时:优先从local>glo ...

  6. 对Java虚拟机理解

    深入理解Java虚拟机 Java技术体系 Java体系分为四个平台 Java card 运行在小内存上的 Java ME 运行在手机上 Java SE 完整Java 核心api JavaEE 支持使用 ...

  7. 并发编程——ConcurrentHashMap#transfer() 扩容逐行分析

    前言 ConcurrentHashMap 是并发中的重中之重,也是最常用的数据结果,之前的文章中,我们介绍了 putVal 方法.并发编程之 ConcurrentHashMap(JDK 1.8) pu ...

  8. jQuery实现两个DropDownList联动(MVC)

    近段时间原本是学习MVC的,谁知道把jQuery也学上了.而且觉得对jQuery更感兴趣,比如今早上有写了一个练习<jQuery实现DropDownList(MVC)>http://www ...

  9. Scott用户的表结构

    在Oracle的学习之中,重点使用的是SQL语句,而所有的SQL语句都要在scott用户下完成,这个用户下一共有四张表,可以使用: SELECT * FROM tab; 查看所有的数据表的名称,如果现 ...

  10. [日常] Go语言圣经--接口约定习题2

    练习 7.3: 为在gopl.io/ch4/treesort (§4.4)的*tree类型实现一个String方法去展示tree类型的值序列. package main import( "f ...