【转】Mysql学习---MySQL悲观锁中的排它锁

【原文】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. 除了在数据库中通过悲观锁保证同一时间只有一个线程对某个资源进行操作,还有其他办法实现这样的功能吗?

原文地址:https://www.cnblogs.com/ftl1012/p/9567465.html

时间: 2024-10-10 09:25:09

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

MySQL学习笔记-操作数据表中的记录

MySQL学习笔记-操作数据表中的记录 1.插入记录 INSERT INSERT [INTO] tbl_name [(col_name,...)] {VAULES|VALUE} ({expr|DEFAULT},...),(...),... 例,插入单条记录: mysql> USE testDatabase changed mysql> CREATE TABLE users(    -> id SMALLINT UNSIGNED AUTO_INCREMENT PRIMARY KEY,   

mysql学习--mysql必知必会

上图为数据库操作分类: 以下的操作参考(mysql必知必会) 创建数据库 执行脚本建表: mysql> create database mytest; Query OK, 1 row affected (0.07 sec) mysql> show databases; +--------------------+ | Database | +--------------------+ | information_schema | | mysql | | mytest | | performan

mysql学习--mysql必知必会1

?? 例如以下为mysql必知必会第九章開始: 正則表達式用于匹配特殊的字符集合.mysql通过where子句对正則表達式提供初步的支持. keywordregexp用来表示后面跟的东西作为正則表達式处理. (.)是正則表達式的一个符号,表示匹配随意一个字符: mysql> select prod_name -> from products -> where prod_name regexp '.000' -> order by prod_name; +--------------

mysql学习——mysql查询语句综合练习

练习一: 设有成绩表stu如下: 姓名 科目 成绩 张三 数学 90 张三 语文 50 张三 地理 40 李四 语文 55 李四 政治 45 王五 政治 30 王五 数学 70 试查询两门及两门以上不及格同学的平均分 解答如下 1.创建数据表 create table stu(id int primary key auto_increment,name char(3) not null default'',subject char(3) not null default'',score deci

【mysql】关于悲观锁

关于mysql中的锁 在并发环境下,有可能会出现脏读(Dirty Read).不可重复读(Unrepeatable Read). 幻读(Phantom Read).更新丢失(Lost update)等情况,所以mysql引入了很多锁的概念 MySQL InnoDB对数据行的锁定类型一共有四种:共享锁(读锁,S锁).排他锁(写锁,X锁).意向共享锁(IS锁)和意向排他锁(IX锁),支持三种行锁定方式: 行锁(Record Lock):锁直接加在索引记录上面. 间隙锁(Gap Lock):锁加在不存

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

悲观锁,正如其名,它指的是对数据被外界(包括本系统当前的其他事务,以及来自外部系统的事务处理)修改持保守态度,因此,在整个数据处理过程中,将数据处于锁定状态.悲观锁的实现,往往依靠数据库提供的锁机制(也只有数据库层提供的锁机制才能真正保证数据访问的排他性,否则,即使在本系统中实现了加锁机制,也无法保证外部系统不会修改数据). 使用场景举例:以MySQL InnoDB为例, 商品goods表中有一个字段status,status为1代表商品未被下单,status为2代表商品已经被下单,那么我们对某

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

Mysql体系结构与Mysql存储引擎 Mysql体系结构 mysql体系结构图: 1)        Connectors:指的是不同语言中与SQL的交互 max_connections 就是整个MySQL实例的最大连接数限制 max_user_connections 是单个用户的最大连接数,这里未指明是哪个用户,是任意一个用户. 2)        Management Serveices & Utilities:系统管理和控制工具 备份和恢复的安全性,复制,集群,管理,配置,迁移和元数据

【数据库】Mysql学习-mysql安装

参考:https://www.cnblogs.com/kennyliu/p/8004808.html 一.下载 进入:https://dev.mysql.com/downloads/mysql/ 下载: 二.配置 my.ini配置: [mysql]# 设置mysql客户端默认字符集default-character-set=utf8 [mysqld]#设置3306端口port = 3306 # 设置mysql的安装目录basedir=F:\DevelopEnv\database\mysql-5.

Hibernate学习:悲观锁

一:测试程序 二:代码分析 (1)debug方法testPessimisticLock, Account a = (Account) session.load(Account.class, 1,LockMode.UPGRADE); session.getTransaction().commit();         在session提交的这一行,加上断点. (2)执行方法testOperate 会发现,改方法并没有成功修改数据 (3)将testPessimisticLock断点走完 (4)tes