【转】Mysql学习---MySQL悲观锁中的排它锁
【原文】https://www.toutiao.com/i6595305814087434760/
悲观锁中的排它锁。
- 排它锁关键字:for update
- 特点:会锁住行或者表,防止其他事务进行修改操作或者获取锁操作。
解决办法
该解决办法就是通过排它锁:for update进行操作
上述SQL可以通过下图进行展现:
- 线程1:在A时刻开始事务,并将goods_id为1的那一行锁住(行锁),然后进行查询,获取库存。
- 线程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将需要操作的列锁住,直到当前线程操作完成,将事务提交后,其他线程的事务才能接着进行操作。
这就是一种独占思维:每一次只允许一个线程进行操作,其他想操作的线程,必须等我处理完后才能进行处理。
老样子,我在这里留点思考题,感兴趣的同学可以在评论区谈谈想法:
- 悲观锁有2种:排他锁和共享锁,本文是通过排它锁来防止超卖的,可以通过共享锁来实现防止超吗?
- 除了在数据库中通过悲观锁保证同一时间只有一个线程对某个资源进行操作,还有其他办法实现这样的功能吗?
【转】Mysql学习---MySQL悲观锁中的排它锁的更多相关文章
- mysql 学习日记 悲观和乐观锁
理解 悲观锁就是什么事情都是需要小心翼翼,生怕弄错了出大问题, 一般情况下 "增删改" 都是有事务在进行操作的,但是 "查" 是不需要事务操作的, 但是凡事没 ...
- 【mysql】关于悲观锁
关于mysql中的锁 在并发环境下,有可能会出现脏读(Dirty Read).不可重复读(Unrepeatable Read). 幻读(Phantom Read).更新丢失(Lost update)等 ...
- mysql(for update)悲观锁总结与实践
悲观锁,正如其名,它指的是对数据被外界(包括本系统当前的其他事务,以及来自外部系统的事务处理)修改持保守态度,因此,在整个数据处理过程中,将数据处于锁定状态.悲观锁的实现,往往依靠数据库提供的锁机制( ...
- MySQl学习-——Mysql体系结构与Mysql存储引擎
Mysql体系结构与Mysql存储引擎 Mysql体系结构 mysql体系结构图:
- php+redis 学习 二 悲观锁
<?php header('content-type:text/html;chaeset=utf-8'); /** * redis实战 * * 实现悲观锁机制 * */ $timeout = 5 ...
- mysql悲观锁中的共享锁和排他锁
概述: 共享锁又称为读锁,简称S锁,顾名思义,共享锁就是多个事务对于同一数据可以共享一把锁,都能访问到数据,但是只能读不能修改. 排他锁又称为写锁,简称X锁,顾名思义,排他锁就是不能与其他所并存,如一 ...
- MySQL学习笔记:计算机服务中找不到MySQL服务
不知道什么原因,连接了远程服务器之后,本地服务就连接不上. 经排查,发现服务中的MySQL服务居然不见,一番搜索之后,在CMD中进入到MySQL安装目录的bin下执行以下语句: mysqld.exe ...
- mysql学习笔记(编辑中)
1.LAST_INSERT_ID()依赖于当前服务器会话中自动产生的序列编号.同时括号中也可以赋值更新数据,eg: update test set id = last_insert_id(id+10) ...
- MySQL学习之路3-MySQL中常用数据类型
MySQL中常用数据类型 字符型 存储字符型数据.例如姓名,地址,电话号码等.使用引号括起来,一般使用单引号. 常用类型: char(255) 定长字符串,最大长度255个字符. varchar(25 ...
随机推荐
- shell脚本案例分享 - 业务系统日志自定义保留或删除需求
需求说明: 线上某些业务系统的日志不定期产生, 有的每天产生, 有的好几天才产生, 因为系统只有在用的时候才产生日志,日志文件均存放在以当天日期命名的目录下. 当日志目录越来越多时就需要处理, 由此 ...
- LVS专题-(1)LVS基本介绍
LVS官方网站:http://www.linuxvirtualserver.org/zh/lvs1.html
- ELK常用命令
1.查询当前所有的索引 #curl 'localhost:9200/_cat/indices?v' 2.查看集群健康状态 #curl 'localhost:9200/_cat/health?v' 绿色 ...
- 【一个小功能】从js判断ie版本,浅谈navigator对象的appName属性
判断IE版本主要的是获取两个属性,a.当前浏览器名称,b.当前浏览器版本,为此不得不了解navigator对象. 先贴代码 window.onload = function() { var brows ...
- Web服务器与客户端三种http交互方式
近期在对接项目时用到http方式与第三方交互数据,由于中间沟通不足导致走了不少弯路,至此特意花了点时间总结服务端与客户端数据交互的方式,本地搭建两个项目一个作为服务端,一个作为客户端.post可以有两 ...
- VC++6.0调试:Watch窗口的使用
#include <stdio.h> #include <windows.h> class AutoExpand { public: AutoExpand(int val, c ...
- [日常] Go语言圣经--并发的web爬虫
两种: crawler.go package main import ( "fmt" "links" //"log" "os&qu ...
- [日常] Linux下的docker实践
1.Linux 发展出了另一种虚拟化技术:Linux 容器(Linux Containers,缩写为 LXC) 2.Linux 容器不是模拟一个完整的操作系统,而是对进程进行隔离 3.Docker 属 ...
- 自己写一个java的mvc框架吧(三)
自己写一个mvc框架吧(三) 根据Method获取参数并转换参数类型 上一篇我们将url与Method的映射创建完毕,并成功的将映射关系创建起来了.这一篇我们将根据Method的入参参数名称.参数类型 ...
- CentOS压力测试 ab 命令安装与使用
Apache安装包中自带的压力测试工具 Apache Benchmark(简称ab) 简单易用,这里就采用 ab作为压力测试工具了. 1.独立安装 ab运行需要依赖apr-util包,安装命令为: y ...