mysql数据库锁机制的介绍

本篇文章给大家带来的内容是关于mysql数据库锁机制的介绍,有一定的参考价值,有需要的朋友可以参考一下,希望对你有所帮助。

并发控制

数据库管理系统中的并发控制的任务是确保在多个事务同时存取数据库中同一数据时不破坏事务的隔离性和统一性以及数据库的统一性。

封锁,时间戳,乐观并发控制和悲观并发控制是并发控制主要采用的技术手段

锁

当并发事务同时访问一个资源时,有可能导致数据不一致,因此需要一种机制来将数据访问顺序化,以保证数据库数据的一致性。锁就是其中的一种机制(推荐教程:MySQL教程)

锁的分类

按照操作划分,可分为DML锁,DDL锁

按锁粒度划分,可分为表级锁,行级锁,页级锁(mysql)

按锁级别划分,可分为共享锁,排他锁

按加锁方式划分,可分为自动锁,显示锁

按使用方式划分,可分为乐观锁,悲观锁

DML锁用于保护数据的完整性,其中包括行级锁(TX锁),表级锁(TM锁)。DDL锁用于保护数据库对象的结构,如表,索引等的结构定义,其中包括排他DDL锁,共享DDL锁,可中断解析锁

行级锁

行级锁是Mysql中锁定力度最细的一种锁,表示只针对当前操作的行进行加锁。行级锁能大大减少数据库操作的冲突。其加锁粒度最小,但是加锁的开销也最大。行级锁分为共享锁和排他锁

特点:开销大,加锁慢;会出现死锁;锁定粒度最小,发生锁冲突的概率最低,并发度也最高

表级锁

表级锁是Mysql中锁定粒度最大的一种锁,表示对当前操作的整张表加锁,它实现简单,资源消耗较少,被大部分Mysql引擎支持。最常见使用的MYISAM与INNODB都支持表级锁定。表级锁定分为表分享读锁(共享锁)和表独占写锁(排他锁)

特点:开销小,加锁快;不会出现死锁;锁定粒度大,发出锁冲突的概率最高,并发性最低

页级锁

页级锁是Mysql中锁定粒度介于行级锁和表级锁中间的一种锁。表级锁速度快,但是冲突多,行级冲突少,但是速度慢。页级锁折中,以此锁定相邻的一组纪录。BDB支持页级锁

Mysql常用存储引擎的锁机制

MyISAM和MEMORY采用表级锁

BDB采用页级锁或表级锁,默认是页级锁

InnoDB支持行级锁和表级锁,默认为行级锁

InnoDB的行锁和表锁

InnoDB引擎中既支持行锁也支持表锁,那么什么时候会锁住整张表,什么时候锁住一行??

InnoDB行锁是通过给索引上的索引项加锁实现的,这点Mysql跟Oracle不同,后者是通过在数据块中对相应数据行加锁来实现的。InnoDB这种行锁实现特点意味着:只有通过索引条件检索数据,InnoDB才使用行级锁,否则InnoDb将使用表锁

实际应用中,要注意InnoDB行锁的这一特性,否则容易导致大量的锁冲突,从而影响并发性能

在不通过索引条件查询的时候,InnoDB使用的是表锁,而不是行锁

由于MySQL的行锁是针对索引加的锁,不是针对纪录加的锁,所以虽然访问不同行的纪录,但是如果使用相同索引的键,是会出现锁冲突的。

当表有多个索引的时候,不同的事务可以使用不同的索引锁定不同的行,另外不论是使用主键索引,唯一索引还是普通索引,InnoDB都会使用行锁来对数据加锁

即便在条件中使用了索引字段,但是否使用索引来检索数据是由Mysql通过判断不同之行计划的代价来决定的,如果Mysql认为全表扫效率更高,比如对一些很小的表,它就不会使用索引,这种情况InnoDB将使用表锁而不是行锁。因此分析锁冲突的时候,别忘记检查SQL的执行计划

怪兽AI知识库 怪兽AI知识库

企业知识库大模型 + 智能的AI问答机器人

怪兽AI知识库 51 查看详情 怪兽AI知识库

行级锁和死锁

MyISAM是不会产生死锁的,因为MyISAM总是一次性获得所需的全部锁,要么全部满足,要么全部等待。而在InnoDB中,锁是逐步获得的,就造成死锁的可能

在MySQL中,行级锁并不是直接锁纪录,而是锁索引。索引分为主键索引和非主键索引两种,如果一条sql语句操作了主键索引,MySQL就会锁住这条主键索引;如果一条语句操作了非主键索引,MySQL就会先锁定该非主键索引,再锁定相关的主键索引。在Update,delete操作时,MySQL不仅锁定where条件扫描过的所有索引记录,而且会锁定相邻的键值,即所谓的next-key locking

死锁:当两个事务同时执行,一个锁住了主键索引,在等待其他相关索引。另一个锁定了非主键索引,在等待主键索引。这样就发生死锁。

发生死锁后,InnoDB一般都可以检测到,并使一个事务释放锁回退,另一个获取锁完成事务

避免死锁

如果不同程序会并发存取多个表,尽量约定以相同的顺序访问表,可以大大降低死锁机会

在同一个事务中,尽可能做到一次锁定所需要的所有资源,减少死锁产生概率

对于非常容易产生死锁的业务部分,可以尝试使用升级锁定颗粒度,通过表级锁定来减少死锁

共享锁和排他锁

行级锁是MySQL中锁定粒度最细的一种锁,行级锁能够大大减少数据库操作的冲突。行级锁分为共享锁和排他锁

1. 共享锁

共享锁又称读锁,是读取操作创建的锁。其他用户可以并发读取数据,但任何事务都不能对数据进行修改,直到已释放所有共享锁。

如果事务T对数据A加上共享锁后,那么其他事务只能对A再加共享锁,不能加排他锁。获准共享锁的事务只能读数据,不能修改数据

如果事务T对数据A加上共享锁后,又对数据进行修改,那么其他事务将不能获取共享锁;同样的,若多个事务对同一数据获取共享锁,则任何事务不能对该数据进行修改

用法: SSELECT … LOCK IN SHARE MODE

在查询语句后面增加LOCK IN SHARE MODE,Mysql会对查询结果中的每行都加共享锁,当没有其他线程对查询结果集中的任何一行使用排他锁时,可以成功申请共享锁,否则会被阻塞。其他线程也可以读取使用了共享锁的表,而且这些线程读取到的是同一个版本的数据

2. 排他锁

排他锁又称写锁,如果事务T对数据A加上排他锁后,则其他事务不能再对A加任何类型的封锁。获取排他锁的事务既能读数据,又能修改数据

用法:SELECT … FOR UPDATE 。在查询语句后面增加FOR UPDATE,MySQL会对查询结果中的每行都加排他锁,当没有其他线程对查询结果集的任何一行使用排他锁时,可以成功申请排他锁,否则会被阻塞

3. 意向锁

意向锁是表级锁,其设计目的是为了在一个事务中揭示下一行将要被请求锁的类型。InnoDB中的两个表锁:

意向共享锁(IS):表示事务准备给数据行加入共享锁,也即是说一个数据行加共享锁前必须先取得该表的IS锁

意向排他锁(IX):表示事务准备给数据行加入排他锁,说明事务在一个数据行加排他锁前必须先去的该表的IX锁

意向锁是InnoDB自动加的,不需要用户干预

总结

对于insert,update,delete,InnoDB会自动给涉及到的数据加排他锁;对于一般的Select语句,InnoDB不会加任何锁,事务可以通过以下语句给显式加上共享锁或排他锁

共享锁:select … LOCK IN SHARE MODE

排他锁:SELECT … FOR UPDATE

以上就是mysql数据库锁机制的介绍的详细内容,更多请关注创想鸟其它相关文章!

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

赞 (0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
《绝地潜兵2》新债券”法律铁腕“更新 致敬经典科幻电影《特警判官》《机械战警》
上一篇 2025年11月6日 10:04:18
优化动态网站的移动性能和媒体加载
下一篇 2025年11月6日 10:04:30

相关推荐

  • 探秘MySQL MyISAM引擎的性能优化策略

    探秘mysql myisam引擎的性能优化策略 引言:在MySQL数据库中,MyISAM引擎是一种常用的数据库引擎之一。它以其简单、易于管理和高性能的特点,广泛应用于各种数据库应用中。然而,随着数据库数据量的不断增长和查询访问的复杂度提高,MyISAM引擎的性能优化就变得非常重要。本文将探讨 MyI…

    2026年10月6日
    000
  • 如何使用MySQL的IFNULL函数处理空值问题

    如何使用mysql的ifnull函数处理空值问题 在日常的数据库操作中,我们经常会遇到处理空值(NULL)的情况。MySQL提供了很多函数来处理空值,其中IFNULL函数是一个非常常用的函数。本文将介绍如何使用IFNULL函数来处理MySQL中的空值问题,并提供一些使用示例。 一、IFNULL函数的…

    2026年10月6日
    000
  • 使用MySQL存储引擎选择合适的储存结构

    使用mysql存储引擎选择合适的存储结构 在使用MySQL数据库时,选择合适的存储引擎是至关重要的。不同的存储引擎具有不同的特点和适用场景,选择适合的存储引擎可以提高数据库性能和效率。本文将介绍MySQL中几种常见的存储引擎,并给出相应的代码示例。 InnoDB引擎 InnoDB引擎是MySQL的默…

    2026年10月6日
    000
  • MyRocks引擎:提升MySQL的IO效率与存储容量

    myrocks引擎:提升mysql的io效率与存储容量 随着互联网的发展,数据量的爆发式增长对数据库的存储容量和读写效率提出了更高的要求。MySQL作为最广泛使用的关系型数据库之一,一直以来都在不断改进和优化。其中,MyRocks引擎作为MySQL的一种存储引擎,以其出色的IO效率和存储容量优势受到…

    2026年10月6日
    100
  • 利用MySQL和F#语言开发:如何实现数据缓存功能

    利用mysql和f#语言开发:如何实现数据缓存功能 引言:在开发过程中,我们经常需要从数据库中读取大量的数据。然而,频繁地从数据库中读取数据会降低系统的性能,因此使用数据缓存是一个非常好的解决方案。本文将介绍如何利用MySQL和F#语言来实现数据缓存功能,以提高系统的性能和效率。 一、需求分析在实现…

    2026年10月6日
    000
  • 如何在MySQL中使用索引提示来优化查询计划?

    如何在mysql中使用索引提示来优化查询计划? 一、什么是索引在MySQL中,索引是用于提高查询效率的一种数据结构。它可以帮助我们快速定位到需要查询的数据,从而减少数据的扫描和比较次数,提高查询的速度。 二、索引的优点和缺点 优点:(1) 提高查询效率:通过构建索引,可以快速定位到需要查询的数据,避…

    2026年10月6日
    200
  • MySQL和Prolog:如何实现数据逻辑推理功能

    mysql和prolog: 如何实现数据逻辑推理功能 引言:在当今技术飞速发展的时代,数据处理和逻辑推理成为了各行各业中的关键任务。MySQL作为一款常用的关系型数据库管理系统,主要用于数据的存储和查询。而Prolog则是一种常见的逻辑编程语言,用于解决逻辑问题和实现推理功能。本文将介绍如何结合My…

    2026年10月6日
    200
  • MySQL中如何进行数据的删除和清理操作?

    mysql中如何进行数据的删除和清理操作? 在使用MySQL数据库时,数据的删除和清理操作是非常重要的,可以帮助我们删除不需要的数据,优化数据库性能,以及释放数据库的存储空间。本文将介绍如何使用MySQL进行数据的删除和清理操作的方法,并提供相应的代码示例。 一、删除数据 DELETE语句 DELE…

    2026年10月6日
    100
  • MySQL怎样跳过错误继续执行 事务错误处理与跳过技巧

    MySQL怎样跳过错误继续执行 事务错误处理与跳过技巧MySQL怎样跳过错误继续执行 事务错误处理与跳过技巧MySQL怎样跳过错误继续执行 事务错误处理与跳过技巧MySQL怎样跳过错误继续执行 事务错误处理与跳过技巧

    mysql中跳过错误继续执行需通过特定方法实现1.在事务处理中可通过定义declare continue handler for sqlexception异常处理器模拟try…catch结构实现错误捕获并继续执行后续语句2.mysql无全局忽略错误设置但可使用-f或–forc…

    2026年10月6日 • 用户投稿
    100
  • 如何使用MySQL在Scala中实现数据聚合操作

    如何使用mysql在scala中实现数据聚合操作 引言:MySQL是一种非常流行的关系型数据库管理系统,而Scala是一种强大的编程语言,两者结合起来可以实现数据聚合操作。在本文中,我们将介绍如何使用MySQL和Scala进行数据聚合操作,并附上相应的代码示例。 一、连接到MySQL数据库在Scal…

    2026年10月6日
    100
  • 利用MySQL和CoffeeScript开发:如何实现数据搜索功能

    利用mysql和coffeescript开发:如何实现数据搜索功能 引言:在Web应用程序中,数据搜索功能是非常常见且重要的。无论是电子商务网站还是社交媒体平台,用户都希望能够快速准确地找到自己需要的信息。本文将介绍如何利用MySQL和CoffeeScript来实现一个简单的数据搜索功能,并附上相应…

    2026年10月6日
    100
  • 如何使用MySQL在SwiftUI中实现数据绑定功能

    如何使用mysql在swiftui中实现数据绑定功能 在SwiftUI开发中,通过数据绑定可以实现界面与数据的自动更新,提高用户体验。而MySQL作为一款流行的关系型数据库管理系统,可以存储和管理大量的数据。本文将介绍如何使用mysql在swiftui中实现数据绑定功能。我们将利用Swift的第三方…

    2026年10月5日
    200
  • 如何使用MySQL在Rust中实现数据索引功能

    如何使用mysql在rust中实现数据索引功能 MySQL是一个功能强大的关系型数据库管理系统,被广泛应用于各种Web应用程序中。而Rust是一种系统级编程语言,它注重安全性、并发性和性能,逐渐受到开发者的关注和喜爱。那么,在Rust中如何使用MySQL来实现数据索引功能呢?接下来,我们将详细介绍该…

    2026年10月5日
    100
  • MySQL中如何进行数据的ETL操作?

    mysql中如何进行数据的etl操作? 数据ETL(Extract-Transform-Load)操作是指将数据从一个系统中提取出来,经过一系列的转换处理后,加载到另一个系统中。在MySQL数据库中,进行数据ETL操作可以使用多种方法,如使用命令行工具、使用存储过程或使用ETL工具,这篇文章将重点介…

    2026年10月5日
    100
  • 学习MySQL的数据库备份和恢复技巧有哪些?

    学习mysql的数据库备份和恢复技巧有哪些? MySQL是一款常用的关系型数据库管理系统,为了确保服务器系统的稳定性和数据的安全性,数据库备份和恢复是非常重要的工作。本文将介绍一些学习MySQL数据库备份和恢复的技巧,以及相关的代码示例。 MySQL数据库备份 数据库备份是指将数据库中的数据和结构进…

    2026年10月5日
    100
  • MySQL中如何实现数据的压缩和解压缩?

    mysql是一种被广泛使用的关系型数据库管理系统,支持数据的压缩和解压缩功能。在大规模数据存储和处理中,数据的压缩可以显著减少存储空间占用以及提高数据的传输效率。本文将介绍mysql中如何实现数据的压缩和解压缩,并给出相应的代码示例。 一、压缩数据 MySQL提供了多种压缩算法,例如LZ4、Zlib…

    2026年10月5日
    100
  • MySQL和Lua:如何实现数据分布式存储功能

    标题:mysql和lua:如何实现数据分布式存储功能 摘要:数据分布式存储是一个重要的技术,在大规模数据处理和跨地域部署中起着关键作用。本文将介绍如何使用MySQL和Lua来实现数据分布式存储功能,并提供代码示例。 正文: 概述数据分布式存储是通过将数据分散存储在不同的机器或节点上,以实现横向扩展和…

    2026年10月5日
    100
  • MySQL中如何进行数据的时序存储和查询?

    mysql中如何进行数据的时序存储和查询? 在许多应用场景中,对于数据的时序性要求是非常常见的,比如传感器数据的监测、日志记录等。MySQL作为一种常用的关系型数据库,也提供了一些方法来进行时序数据的存储和查询。 一种常见的方法是使用时间戳字段来存储数据的时间信息。在MySQL中,可以使用TIMES…

    2026年10月5日
    300
  • 如何使用Java连接数据库 Java数据库连接步骤详解

    如何使用Java连接数据库 Java数据库连接步骤详解如何使用Java连接数据库 Java数据库连接步骤详解如何使用Java连接数据库 Java数据库连接步骤详解如何使用Java连接数据库 Java数据库连接步骤详解

    java连接数据库需按步骤操作并注意细节。一要选择合适的驱动,明确数据库类型,考虑版本兼容性和性能测试结果,如mysql用connector/j。二连接字符串配置须严格遵循格式要求,如jdbc:mysql://localhost:3306/mydatabase?user=myuser&pas…

    2026年10月5日 • 用户投稿
    100
  • 学习MySQL的数据库监测和性能优化技巧有哪些?

    学习mysql的数据库监测和性能优化技巧有哪些? 数据库是现代应用不可或缺的一部分,而MySQL作为最常用的关系型数据库管理系统,其性能的高低直接影响着整个应用系统的稳定性和响应速度。因此,学习MySQL的数据库监测和性能优化技巧是非常重要的。 一、数据库监测技巧 了解系统负载:通过查看系统的负载情…

    2026年10月5日
    100

发表回复

登录后才能评论
关注微信