mysql锁的相关知识

这篇具有很好参考价值的文章主要介绍了mysql锁的相关知识。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

下面的所有例子都以一个下面这表为例

CREATE TABLE `blog` (
  `id` int NOT NULL AUTO_INCREMENT,
  `title` varchar(255) DEFAULT NULL,
  `link` varchar(255) DEFAULT NULL,
  `publish_time` varchar(255) DEFAULT NULL,
  `version` int NOT NULL,
  `read_count` varchar(255) DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=202 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci |

mysql锁的概念有很多,悲观锁,乐观锁,行锁,排他锁。。。。,但是请注意,这些概念并不是一个层级的。就像人里面有男人,女人,老人,小孩,公务员,农民等等。

悲观锁与乐观锁

从逻辑概念上来讲,锁分为两种
乐观锁与悲观锁.

所谓乐观锁,就是我乐观的认为,我在写数据的大概率不会发生并发的问题。
所谓悲观锁,就是我认为,我写数据的时候,大概率会发生并发的问题。
从使用上来说
悲观锁,可以通过给sql加上for update这个语句来实现
乐观锁是使用version来辅助执行

  • 悲观锁
    先说明,使用for update语句的时候,得保证两点
    1 所用的存储引擎是InnoDB
    2 并且必须开启事务,在begin与commit之间才生效。
    举个例子
start transaction;

select * from blog where id=62 for update;
update blog set title='new_update' where id=62;

commit;

如果线程A使用上面的语句,在执行到commit之前,线程B发送了下面的语句

update blog set title='new_update2' where id=62;

那最终的结果就是,只要线程A没有commit,线程B的语句就一直卡着不执行。
另外,问一句,如果线程B执行的也只是select操作,并不修改数据,那么线程B可以立即执行么?答案是可以。

  • 乐观锁
    乐观锁的实现,就是加一个version,每次写之前,先读到version,然后写的时候指定version。
select version from blog
update blog set title="xxx",version=version+1 where id=xx,version={version};

行锁,表锁

从锁的范围上来说,锁分行锁,表锁。
什么意思呢?
如果线程A对某张表加了表锁,那么别的线程就不能写这张表了。
如果线程A对某张表的某些行加了行锁,那别的线程就不能修改这几行了。
那常见的sql里面,哪些语句会加行锁,哪些语句会加表锁呢?
例如

update blog set title='xx' where id=13

如上,更新的时候走了索引,那就只锁行

update blog set title='xx' where title='yy'

如上,更新的时候没有走索引,那就锁整表(此时,在另一个线程里如果想更新title='ppp’的数据也是不生效的,因为这边更新title='yy’的时候已经锁表了)。

这里有一个问题?那上面说的悲观锁的for update 是属于行锁还是表锁呢?
上面这个问题本身就是有问题的,因为锁的悲观与乐观和锁的行与表是两组概念,没有直接的隶属关系。

排它锁与共享锁

共享锁又称为读锁,简称S锁,顾名思义,共享锁就是多个事务对于同一数据可以共享一把锁,都能访问到数据,但是只能读不能修改。

排他锁又称为写锁,简称X锁,顾名思义,排他锁就是不能与其他所并存,如一个事务获取了一个数据行的排他锁,其他事务就不能再获取该行的其他锁,包括共享锁和排他锁,但是获取排他锁的事务是可以对数据就行读取和修改。
mysql InnoDB引擎默认的修改数据语句

  • update,delete,insert都会自动给涉及到的数据加上排他锁,
  • select语句默认不会加任何锁类型,
  • 对于select如果加排他锁可以使用select …for update语句,
  • 对于select加共享锁可以使用select… lock in share mode语句。

那问一个问题,假如一个线程A在update数据,(在线程A还没有commit的时候)另一个线程B在直接select 那么可以执行么?
答案是可以。
我去,那不是读写冲突了。
是的,此时线程Bselect的数据是线程A更新执行前的老数据。

参考资料

https://www.jianshu.com/p/1dae2393270d文章来源地址https://www.toymoban.com/news/detail-421768.html

到了这里,关于mysql锁的相关知识的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • MySQL 相关知识

    MySQL 相关知识 1、三大范式 在开发过程中,并不一定要满足三大范式,有时候为了提高查询效率,可以在表中冗余其他表的字段。 2、DML 语句和 DDL 语句区别 DML 是数据库操作语言(Data Manipulation Language)的缩写,是指对数据库中表记录的操作,主要包括表记录的插入、更新、

    2024年02月15日
    浏览(21)
  • mysql 锁相关知识

    数据库级别 全局锁:锁整个数据库,不可写,只读 数据备份时,如果不加该锁,则可能导致数据不一致。 加锁: flush tables with read lock; 解锁 unlock tables; 表级别 表锁: 表共享读锁(read lock):其他客户端不可写,只读 表独占写锁(write lock):其他客户端不可读写 加锁:

    2024年02月07日
    浏览(22)
  • MySQL索引、B+树相关知识汇总

    如果 orders 表是大表(比如 1000 万条记录),而 users 表是相对较小的表(比如几千条记录)。 确保两个表中用于 JOIN 操作的字段都有索引。这是最基本的优化策略,避免数据库进行全表扫描,可以大幅度减少查找匹配行的时间。 在执行 JOIN 操作时,先过滤小表中的数据,这

    2024年04月13日
    浏览(24)
  • MinIO与MySQL对比以及存储的相关知识

    看了一些文章,也没有特别清晰的理解面向对象存储。我发现中文网站上并没有人去对比的写MinIO和MySQL的不同,可能大家觉得这俩根本没必要对比吧。这篇文章会对比MinIO与MySQL,能更直观的理解面向对象存储。(以下内能很多都是按自己的理解,可能有错误,如有错误,请

    2024年02月02日
    浏览(25)
  • 深入理解PHP+Redis实现分布式锁的相关问题

    PHP使用分布式锁,受语言本身的限制,有一些局限性。 通俗理解单机锁问题:自家的锁锁自家的门,只能保证自家的事,管不了别人家不锁门引发的问题,于是有了分布式锁。 分布式锁概念:是针对多个节点的锁。避免出现数据不一致或者并发冲突的问题,让每个节点确保

    2024年03月23日
    浏览(49)
  • 【MySQL】关于数据库字符编码以及字符集排序相关知识

    通过设置表的字符集和排序规则,解决MySQL查询时不区分字母大小写、插入时不支持特殊字符的问题。 关于MySQL查询时不区分字母大小写、插入时不支持特殊字符的问题,只有修改表的字符集和排序规则才能根治,而且事半功倍。utf8mb4支持的最低mysql版本为5.5.3+,若不是,请

    2024年02月12日
    浏览(33)
  • 相关变化率的例子

    如图,不解释。 很多物理学上的物理量,直接使用微分和导数来定义,因此可以不加证明的直接使用这些物理量。 解: d l = 2 , d w = 3 dl = 2, dw = 3 d l = 2 , d w = 3 v = l 2 + w 2 , d v = − 2 l d l + 2 w d w 2 l 2 + w 2 = − 2 × 12 × 2 + 2 × 5 × 3 2 × 13 = 3 v = sqrt{l^2 + w ^2} , dv = - frac{2l dl + 2w d

    2024年02月12日
    浏览(20)
  • 亚信安慧AntDB:深入了解AntDB-M元数据锁的实现之相关概念

    AntDB-M在架构上分为两层,服务层和存储引擎层。元数据的并发管理集中在服务层,数据的存储访问在存储引擎层。为了保证DDL操作与DML操作之间的一致性,引入了元数据锁(MDL)。AntDB-M提供了丰富的元数据锁功能,然而高并发锁操作很容易出现锁竞争、等待、死锁的问题,

    2024年01月22日
    浏览(31)
  • 堆相关例子-最大线段重合问题

    问题描述   给定很多线段,每个线段都有两个数[start, end], 表示线段开始位置和结束位置,左右都是闭区间 规定: 1 )线段的开始和结束位置一定都是整数值 2 )线段重合区域的长度必须 =1 返回线段最多重合区域中,包含了几条线段 例如:[3,10],[3,4],[5,9],[7,13],[9,10]返回3  

    2024年02月09日
    浏览(29)
  • MySQL中锁的概述

    按照锁的粒度来分可分为:全局锁(锁住当前数据库的所有数据表),表级锁(锁住对应的数据表),行级锁(每次锁住对应的行数据) 加全局锁:flush tables with read lock; //为当前实例加上全局锁 然后使用        mysqldump -u用户名 -p密码 备份的数据库名 要备份到的sql文件

    2024年01月25日
    浏览(30)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包