关于MySQL涉及锁的问题详解

如何并发的访问数据库呢?答案就是加锁。

推荐:《mysql视频教程》

接下来说一下,数据库的锁机制,数据库中都有哪些锁?

  首先呢,锁是一种并发控制技术,锁是用来在多个用户同时访问同一个数据的时候保护数据的。

有2种基本的锁类型:

  共享(S)锁:多个事务可封锁一个共享页;任何事务都不能修改该页;通常是该页被读取完毕,S锁立即被释放。在执行select语句的时候需要给操作对象(表或一些记录)加上共享锁,但加锁之前需要检查是否有排他锁,如果没有,则可以加共享锁(一个对象上可以加N个共享锁),否则不行。共享锁通常在执行完select语句之后被释放,当然也可能是在事务结束(包括正常结束和异常结束)的时候被释放,主要取决与数据库所设置的事务隔离级别。

  排它(X)锁:仅允许一个事务封锁此页;其他任何事务必须等到X锁被释放才能对该页进行访问;X锁一直到事务结束才能被释放。执行insert、update、delete语句的时候需要给操作的对象加排它锁,在加排他锁之前必须确认该对象上没有其他任何锁,一旦加上排它锁之后,就不能再给这个对象加其他任何锁。排它锁的释放通常是在事务结束的时候(当然也有例外,就是在数据库事务隔离级别被设置为Read Uncommitted(读未提交数据)的时候,这种情况下排他锁会在执行完更新操作之后被释放,而不是在事务结束的时候)。

按锁的机制

既然使用了锁,就有出现死锁的可能。

产生死锁的四个必要条件:

  互斥条件:一个资源每次只能被一个进程使用。

  请求与保持条件:一个进程因请求资源而阻塞时,对已获得的资源保持不放。

  不可剥夺条件:进程已获得的资源,在未使用完之前,不能强行剥夺。

  环路等待条件:若干个进程之间形成一种头尾相接的循环等待资源关系。

只要系统发生了死锁,这些条件必然成立,而只要上述条件之一不满足,就不会发生死锁。

预防死锁

预防死锁的发生只需要破坏死锁产生的四个必要条件之一即可。

1)破坏互斥条件

  如果允许系统资源都能共享使用,则系统不会进入死锁状态。但有些资源根本不能同时访问,如打印机等临界资源只能互斥使用。所以破坏互斥条件而预防死锁的方法不太可行,而且在有些场合应该保护这种互斥性。

2)破坏不可剥夺条件

  当一个已保持了某些不可剥夺资源的进程,请求新的资源而得不到满足时,它必须释放已经保持的所有资源,待以后需要时再重新申请。这意味着,一个进程已占有的资源会被暂时释放,或者说是被剥夺了,或从而破坏了不可剥夺条件。

  该策略实现起来比较复杂,释放已获得的资源可能造成前一阶段工作的失效,反复地申请和释放资源会增加系统开销,降低系统吞吐量。这种方法常用于状态易于保存和恢复的资源,如CPU的寄存器及内存资源,一般不能用于打印机之类的资源。

3)破坏请求和保持的条件

  采用预先静态分配方法,即进程在运行前一次申请完它所需要的全部资源,在它的资源为满足前,不把它投入运行。一旦投入运行后,这些资源就一直归它所有,也不再提出其他资源请求,这样就可以保证系统不会发生死锁。

  这种方式实现简单,但缺点也显而易见,系统资源被严重浪费,其中有些资源可能仅在运行初期或运行快结束时才使用,甚至根本不使用。而且还会导致“饥饿”现象,当由于个别资源长期被其他进程占用时,将致使等待该资源的进程迟迟不能开始运行。

4)破坏环路等待条件

  为了破坏环路等待条件,可采用顺序资源分配法。首先给系统中的资源编号,规定每个进程,必须按编号递增的顺序请求资源,同类资源一次申请完。也就是说,只要进程提出申请分配资源Ri,则该进程在以后的资源申请种,只能申请编号大于Ri的资源。

  这种方法存在的问题时,编号必须相对稳定,这就限制了新类型设备的增加;尽管在为资源编号时已考虑到大多数作业实际使用这些资源的顺序,但也经常会发生作业使用资源的顺序与系统规定顺序不同的情况,造成资源的浪费;此外,这种按规定次序申请资源的方法,也必然会给用户的编程带来麻烦。

解除死锁

  1)从死锁进程处剥夺资源;

  2)终止部分或全部进程;

AI建筑知识问答 AI建筑知识问答

用人工智能ChatGPT帮你解答所有建筑问题

AI建筑知识问答 22 查看详情 AI建筑知识问答

MySQL锁的粒度(即锁的级别)

MySQL各存储引擎使用了三种类型(级别)的锁定机制:行级锁定、页级锁定和表级锁定。

  1、表级锁:直接锁定整张表,在你锁定期间,其他进程无法对该表进行写操作。如果你是写锁,则其他进程则读也不允许。特点:开销小,加锁快;不会出现死锁;锁粒度最大,发生锁冲突的概率最高,并发度最低。

    MyISAM存储引擎采用的是表级锁。

    有两种模式:表共享读锁和表独占写锁。加读锁的命令:lock table 表名 read;  去掉锁的命令:unlock tables。

    支持并发插入:支持查询和插入操作并发运行(在表尾并发插入)。

    锁调度机制:写锁优先。一个进程请求某个MyISAM表的读锁,同时另一个进程也请求同一表的写锁,MySQL如何处理呢?答案是写进程先获得锁。

  2、行级锁:仅对指定的记录进行加锁,这样其他进程还是可以对同一个表中的其他记录进行操作。特点:开销大,加锁慢;会出现死锁;锁粒度最小,发生锁冲突的概率最低,并发度也最高。

    InnoDB存储引擎既支持行级锁,也支持表级锁,但默认情况下是采用行级锁。

  3、页级锁:一次锁定相邻的一组记录。开销和加锁时间介于表锁和行锁之间;会出现死锁;锁定粒度介于表锁和行锁治安,并发度一般。

  最常用的处理多用户并发访问的方法是加锁。当一个用户锁定数据库中的某个对象时,其他用户就不能再访问该对象。加锁对并发访问的影响体现在锁的粒度上。比如,(表锁)放在一个表上的锁限制对整个表的并发访问;(页锁)放在数据页上的锁限制了对整个数据页的访问;(行锁)放在行上的锁只限制对该行的并发访问。

乐观锁和悲观锁的概念,实现方式和使用场景

锁有两种机制:悲观锁和乐观锁。

  悲观锁,锁如其名,它对世界是悲观的,它认为别人访问正在改变的数据的概率是很高的,所以从数据开始更改时就将数据锁住,直到更改完成才释放。

一个典型的依赖数据库的悲观锁调用:

  select * from account where name=”Erica” for update

  这条SQL语句锁定了account表中所有符合检索条件(name=”Erica”)的记录。本事务提交之前(事务提交时会释放事务过程中的锁),外界无法修改这些记录。该语句用来锁定特定的行(如果where子句,就是满足where条件的那些行)。当这些行被锁定后,其他会话可以选择这些行,但不能更改或删除这些行,直到该语句的事务被commit语句或rollback语句结束终止。需要注意的是,select …for update要放到MySQL的事务种,即begin和commit中,否则不起作用。

  悲观所可能会造成加锁的时间很长,并发行不好,特别是长事务,影响系统的整体性能。

  悲观所的实现方式:

    悲观锁,也是基于数据库的锁机制实现。传统的关系型数据库里边就用到了很多这种锁机制,比如行锁,表锁等,读锁、写锁等,都是在做操作之前先上锁。

  乐观锁,它对世界比较乐观,认为别人访问正在改变的数据的概率是很低的,所以直到修改完成准备提交所作的修改到数据库的时候才会将数据锁住,当你读取以及改变该对象时并不加锁,完成更改后释放。乐观锁不能解决脏读的问题。

  乐观锁加锁的时间要比悲观锁短,大大提升了大并发量下的系统整体性能表现。

  乐观锁的实现方式:

    1、大多是基于数据版本(version)记录机制实现,需要为每一行数据增加一个版本标识(也就是每一行数据多一个字段version),每次更新数据都要更新对应的版本号+1。

    工作原理:读出数据时,将此版本一同读出,之后更新时,对此版本号加一。此时,将提交的数据的版本信息与数据库表对应记录的当前版本信息进行比对,如果提交的数据版本号大于数据库表当前版本号,则予以更新,否则认为是过期数据,不得不重新读取该对象并作出更改。

    2、使用时间戳来实现

    同样是在需要乐观锁控制的table中增加一个字段,名称无所谓,字段类型使用时间戳(timestamp),和上面的version类似,也是在更新提交的时候检查当前数据库中数据的时间戳和自己更新前取到的时间戳进行对比,如果一致则OK,否则就是版本冲突。

悲观锁与乐观锁的适用场景:

  如果并发量不大,可以使用悲观锁解决并发问题;但如果系统的并发量非常大的话,悲观所定会带来非常大的性能问题,所以我们就要选择乐观锁定的方法。现在大部分应用都应该是乐观锁的。

以上就是关于MySQL涉及锁的问题详解的详细内容,更多请关注创想鸟其它相关文章!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 chuangxiangniao@163.com 举报,一经查实,本站将立刻删除。
发布者:程序猿,转转请注明出处:https://www.chuangxiangniao.com/p/364999.html

赞 (0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
CentOS上HDFS如何集成其他服务
上一篇 2025年11月6日 04:48:15
使用 Diamond 运算符进行类型推断
下一篇 2025年11月6日 04:48:31

相关推荐

  • mysql中存储引擎对大数据量操作的适用性

    InnoDB是大数据量操作的首选存储引擎,支持事务、行级锁、外键及聚簇索引,适合高并发与大容量场景;MyISAM因表级锁和无事务支持,仅适用于读多写少的特定情况;配合分区、索引优化、读写分离等策略可进一步提升性能。 在MySQL中,存储引擎决定了数据的存储方式、读写机制以及索引结构,对大数据量操作的…

    2026年9月26日
    000
  • MySQL中窗口函数用法 窗口函数在数据分析中的实际案例

    窗口函数是在一组数据行上执行计算并为每一行返回一个值的函数。它与普通聚合函数不同,保留原始数据行并进行行级计算。常见函数包括row_number()、rank()、dense_rank()以及结合over()使用的sum()、avg()等。例如,在计算销售排名时,使用rank() over(orde…

    2026年9月26日
    100
  • Spring Security中自定义过滤器与JWT认证过滤器的执行顺序控制

    Spring Security中自定义过滤器与JWT认证过滤器的执行顺序控制Spring Security中自定义过滤器与JWT认证过滤器的执行顺序控制Spring Security中自定义过滤器与JWT认证过滤器的执行顺序控制Spring Security中自定义过滤器与JWT认证过滤器的执行顺序控制

    在Spring Security应用中,确保自定义过滤器(如多租户过滤器)在JWT认证/授权过滤器之前正确执行至关重要。本文将深入探讨如何通过@Order注解和SecurityFilterChain配置,精确控制自定义OncePerRequestFilter的执行顺序,使其优先于Spring Sec…

    2026年9月26日 • 用户投稿
    100
  • Debian上GitLab的数据库选择

    在debian上部署gitlab时,您可以选择多种数据库。根据搜索结果,以下是几种常见的数据库选择及其相关信息: SQLite 特点:SQLite是一种轻量级的嵌入式数据库管理系统,设计简单,占用空间小,易于使用,不需要独立的数据库服务器。适用场景:适用于小型应用程序或需要在嵌入式设备上运行的应用程…

    2026年9月26日
    800
  • MySQL中正则表达式应用 REGEXP在复杂条件查询中的用法

    mysql 中 regexp 可用于模糊匹配不确定的字符串结构,比 like 更强大。1. 使用 | 匹配多个可能值,如 ‘apple|orange’ 表示“或”关系;2. 用 ^ 和 $ 分别匹配开头和结尾内容,如 ‘^user_’ 或 &#8216…

    2026年9月26日
    100
  • 怎样在MySQL中定义性别字段的数据类型?

    怎样在MySQL中定义性别字段的数据类型?怎样在MySQL中定义性别字段的数据类型?怎样在MySQL中定义性别字段的数据类型?怎样在MySQL中定义性别字段的数据类型?

    在MySQL中定义性别字段的数据类型一般可以使用ENUM类型。ENUM类型可以将字段的值限定在一个指定的值列表中,这样可以确保只能存储预先定义的值。 下面是一个示例代码,演示了如何在MySQL中定义一个包含性别信息的表,并设置性别字段的数据类型为ENUM类型: — 创建包含性别信息的表CREATE…

    2026年9月26日 • 用户投稿
    100
  • MySQL中前缀索引的优势和用法

    MySQL中前缀索引的优势和用法MySQL中前缀索引的优势和用法MySQL中前缀索引的优势和用法MySQL中前缀索引的优势和用法

    MySQL中前缀索引的优势和用法 在MySQL数据库中,索引是提高查询效率的重要手段之一。除了常见的全字段索引外,还有一种特殊的索引叫做前缀索引。本文将介绍前缀索引的优势和用法,并附上具体的代码示例。 1. 什么是前缀索引 前缀索引即只对字段的前几个字符进行索引,而不是整个字段内容。这样做的优势在于…

    2026年9月26日 • 用户投稿
    100
  • MySQL数据库中性别字段应该使用什么数据类型?

    MySQL数据库中性别字段应该使用什么数据类型?MySQL数据库中性别字段应该使用什么数据类型?MySQL数据库中性别字段应该使用什么数据类型?MySQL数据库中性别字段应该使用什么数据类型?

    在MySQL数据库中,性别字段通常可以使用ENUM类型来存储。ENUM是一种枚举类型,它允许我们在一组预定义的值中选择一个作为字段的值。在表示性别这样一个固定且有限的选项时,ENUM是一个很好的选择。 让我们来看一个具体的代码示例: 假设我们有一个名为”users”的表,其中…

    2026年9月26日 • 用户投稿
    300
  • php数据库如何删除记录 php数据库DELETE操作的安全规范

    使用预处理语句可防止SQL注入,确保删除操作安全;应验证用户输入、检查ID合法性,避免直接拼接参数;通过权限校验确认数据归属,防止越权删除;建议采用软删除或二次确认机制,避免误删;DELETE必须包含WHERE条件,禁止无条件删除整表;结合事务与日志审计提升安全性。 在PHP中操作数据库删除记录时,…

    2026年9月26日
    100
  • MySQL如何实现数据分区 范围分区与哈希分区实战

    MySQL如何实现数据分区 范围分区与哈希分区实战MySQL如何实现数据分区 范围分区与哈希分区实战MySQL如何实现数据分区 范围分区与哈希分区实战MySQL如何实现数据分区 范围分区与哈希分区实战

    mysql实现数据分区的常见方式有范围分区和哈希分区。1. 范围分区适合按时间、数值等有明确界限的数据划分,例如按年份对销售表进行分区,能提高查询效率并方便管理;2. 哈希分区适合需要均匀分布数据的场景,如按用户id进行分区,避免数据倾斜。选择分区方式需根据数据特点判断:范围分区查询特定范围高效但可…

    2026年9月26日 • 用户投稿
    200
  • MySQL存储过程:提升数据处理效率的利器

    MySQL存储过程:提升数据处理效率的利器MySQL存储过程:提升数据处理效率的利器MySQL存储过程:提升数据处理效率的利器MySQL存储过程:提升数据处理效率的利器

    MySQL存储过程:提升数据处理效率的利器 在现代数据库管理系统中,存储过程是一种被广泛应用的数据处理工具,用于提高数据库操作的效率和灵活性。MySQL作为一种流行的关系型数据库管理系统,也支持存储过程的使用。本文将介绍MySQL存储过程的基本概念、优势以及具体的代码示例,以帮助读者更好地理解和应用…

    2026年9月26日 • 用户投稿
    100
  • PHP特殊字符转义怎么做_PHP处理HTML特殊字符转义的函数

    htmlspecialchars()用于转义HTML特殊字符以防止XSS攻击,仅处理&”‘五种字符,配合ENT_QUOTES和UTF-8编码可确保安全;htmlentities()则转义所有可表示的字符,适用于多语言场景;输出前应使用这些函数对数据进行转义,但需避免重…

    2026年9月26日
    200
  • 深入理解MySQL存储过程的应用场景

    深入理解MySQL存储过程的应用场景深入理解MySQL存储过程的应用场景深入理解MySQL存储过程的应用场景深入理解MySQL存储过程的应用场景

    深入理解MySQL存储过程的应用场景 MySQL是一种常用的关系型数据库管理系统,广泛应用于各种Web应用和企业信息系统中。存储过程是MySQL中一种重要的数据库对象,它是一组预先编译好的SQL语句和数据处理逻辑的集合,可以被多次调用和重复使用。 存储过程的应用场景非常广泛,它可以用来简化复杂的数据…

    2026年9月26日 • 用户投稿
    000
  • MySQL中布尔类型的优缺点分析

    MySQL中布尔类型的优缺点分析MySQL中布尔类型的优缺点分析MySQL中布尔类型的优缺点分析MySQL中布尔类型的优缺点分析

    MySQL中布尔类型的优缺点分析 MySQL是一种流行的关系型数据库管理系统,其中布尔类型是一种常见的数据类型之一。在MySQL中,布尔类型用来存储逻辑值,通常表示真(true)或假(false)。在本文中将对MySQL中布尔类型的优缺点进行分析,同时会提供具体的代码示例来帮助读者更好地理解。 优点…

    2026年9月26日 • 用户投稿
    100
  • 深入理解MySQL触发器的参数设置

    深入理解MySQL触发器的参数设置深入理解MySQL触发器的参数设置深入理解MySQL触发器的参数设置深入理解MySQL触发器的参数设置

    MySQL 触发器是一种在数据库表中定义的一系列操作,当满足特定条件时自动触发执行。触发器可以在 insert、update 或 delete 操作前或后执行一些特定的SQL语句,以实现数据变化时的自动化处理。触发器的参数设置对于正确的使用和效率优化非常重要,本文将深入探讨MySQL触发器的参数设置…

    2026年9月26日 • 用户投稿
    200
  • 外键在MySQL数据库中的重要性和实践意义

    外键在MySQL数据库中的重要性和实践意义外键在MySQL数据库中的重要性和实践意义外键在MySQL数据库中的重要性和实践意义外键在MySQL数据库中的重要性和实践意义

    外键在MySQL数据库中的重要性和实践意义 在MySQL数据库中,外键(Foreign Key)是一种用来建立不同表之间关联关系的重要约束。外键约束确保了表与表之间的数据一致性和完整性,能够有效避免不正确的数据插入、更新或删除操作。 一、外键的重要性: 降重鸟 要想效果好,就用降重鸟。AI改写智能降…

    2026年9月25日 • 用户投稿
    200
  • MySQL中ibd文件的作用和特点详解

    MySQL中ibd文件的作用和特点详解MySQL中ibd文件的作用和特点详解MySQL中ibd文件的作用和特点详解MySQL中ibd文件的作用和特点详解

    MySQL中ibd文件的作用和特点详解 在MySQL数据库中,每个InnoDB表都对应一个.ibd文件,这个文件是InnoDB存储引擎用来存储表的数据和索引的地方。ibd文件是InnoDB表空间的一部分,它和.ibdata文件一起组成了InnoDB的表空间。 作用: 存储表的数据和索引:ibd文件是…

    2026年9月25日 • 用户投稿
    200
  • MySQL是否区分大小写?

    MySQL是否区分大小写?MySQL是否区分大小写?MySQL是否区分大小写?MySQL是否区分大小写?

    MySQL是否区分大小写?需结合代码示例详细分析 MySQL是一种流行的关系型数据库管理系统,被广泛用于各种应用程序的数据存储和管理。在MySQL中,是否区分大小写是一个常见的问题,对于开发人员来说,了解MySQL的大小写区分规则非常重要,可以避免出现不必要的问题。 在MySQL中,根据不同的设置,…

    2026年9月25日 • 用户投稿
    100
  • MySQL触发器的定义与使用方法详解

    MySQL触发器的定义与使用方法详解MySQL触发器的定义与使用方法详解MySQL触发器的定义与使用方法详解MySQL触发器的定义与使用方法详解

    MySQL触发器的定义与使用方法详解 MySQL触发器是一种特殊的存储过程,可以在表发生特定事件时自动执行。触发器可以用于实现 数据的自动化处理、数据一致性维护等功能。本文将详细介绍MySQL触发器的定义与使用方法,并提供具体的代码示例。 触发器的定义在MySQL中,触发器的定义是通过CREATE …

    2026年9月25日 • 用户投稿
    100
  • MySQL大小写敏感的处理方式

    MySQL大小写敏感的处理方式MySQL大小写敏感的处理方式MySQL大小写敏感的处理方式MySQL大小写敏感的处理方式

    MySQL大小写敏感的处理方式及代码示例 MySQL是一种常用的关系型数据库管理系统,它在处理大小写敏感的问题时需要特别注意。在MySQL中,默认情况下是大小写不敏感的,即不区分大小写。但有时候我们需要进行大小写敏感的处理,这时可以通过以下方法来实现。 在创建数据库、表时指定默认字符集为Bin(二进…

    2026年9月25日 • 用户投稿
    100

发表回复

登录后才能评论
关注微信