iis服务器助手广告广告
返回顶部
首页 > 资讯 > 数据库 >mysql中的锁浅析
  • 748
分享到

mysql中的锁浅析

mysql数据库锁机制 2023-09-15 10:09:03 748人浏览 薄情痞子
摘要

前言 Mysql 锁机制是保证多个并发事务同时访问数据库时数据一致性的重要手段,也是 mysql 的重要特性之一。在实际开发使用 Mysql 数据库时,了解并掌握 MySQL 的锁机制非常重要,因为

在这里插入图片描述

前言

Mysql 机制是保证多个并发事务同时访问数据库时数据一致性的重要手段,也是 mysql 的重要特性之一。在实际开发使用 Mysql 数据库时,了解并掌握 MySQL 的锁机制非常重要,因为不正确的锁机制使用很容易出现严重的性能瓶颈和数据不一致等问题。

一、MySQL 的锁分类

MySQL 中的锁可以分为共享锁和排它锁。共享锁和排它锁是两种不同的锁类型,在不同的场景下发挥着不同的作用。相比较而言,共享锁更适合在读多写少的场景下使用,而排它锁更适合在写多读少的场景下使用。

1. 共享锁(Shared Locks,简称 S 锁)

共享锁指的是多个事务可以同时获得对一个相同资源的锁定,这些事务可以读取但不能修改资源。多个共享锁可以共存,各自都可以读取资源,但是不能够对其进行修改,直到所有的共享锁都被释放为止。

2. 排它锁(Exclusive Locks,简称 X 锁)

排它锁是指一个事务获得资源的锁定后,其他事务就不能再对该资源进行任何锁定,包括共享锁和排它锁。此时,有排它锁的事务既可以读取也可以修改资源,其他任何事务都没有权限读取和修改这个资源,直到当前事务释放了这个锁。
在这里插入图片描述

二、MySQL 的锁粒度分类

MySQL 中的锁还可以按照锁定的粒度大小进行分类。根据粒度大小不同,MySQL 的锁可以分为表锁、行锁、页锁等不同的类型。

1. 表锁

表锁是 MySQL 中最大的锁粒度,指对一整张表进行加锁。当一个事务获得一个表锁后,其他事务就不能对该表进行任何修改操作,直到该事务释放了对该表的锁定。表锁往往被用于一些特定的场景,比如备份、统计、DDL 操作等。MySQL 中的 MyISAM 存储引擎就是使用表锁的例子,它在执行 DML 操作时都会对整张表进行锁定操作。

-- 在 MyISAM 存储引擎中使用表级锁,锁定一个表LOCK TABLES table_name WRITE;-- 执行修改操作UPDATE table_name SET column_name = value WHERE condition;-- 释放表级锁UNLOCK TABLES;

2. 行锁

行锁是 MySQL 中最小的锁粒度,指对一行记录进行加锁。当一个事务获得一个行锁后,其他事务就不能对该行进行任何修改操作,直到该事务释放了对该行的锁定。行锁可以精确地控制锁定的粒度,避免不必要的锁定操作。MySQL 中的 InnoDB 存储引擎就是使用行锁的例子,它在执行修改操作时都会对涉及到的行进行锁定操作。

-- 在 InnoDB 存储引擎中使用行级锁,锁定一行数据SELECT * FROM table_name WHERE primary_key = 1 FOR UPDATE;-- 执行修改操作UPDATE table_name SET column_name = value WHERE primary_key = 1;-- 释放行级锁COMMIT;

3. 页锁

页锁是介于表锁和行锁之间的一种锁粒度,指对一个数据页进行加锁。当一个事务获得一个页锁后,其他事务就不能对该页内的行进行任何修改操作,直到该事务释放了对该页的锁定。MySQL 中的 BDB 存储引擎就是使用页锁的例子,它在执行 DML 操作时会对一页(通常为 4KB)数据进行锁定。
在这里插入图片描述

三、MySQL 的锁机制

MySQL 提供了两种不同的锁机制,分别为悲观锁和乐观锁。下面我们将对这两种锁机制进行详细解释。

1. 悲观锁

MySQL 的悲观锁机制比较常见,也是我们在日常开发中经常使用的锁机制。悲观锁机制认为当多个事务访问同一个数据时,一定会发生冲突从而导致数据不一致情况的发生,因此每次访问该数据时都会进行加锁操作,确保该数据的一致性。

悲观锁的实现方式常见有两种,分别为共享锁和排它锁。在 MySQL 中,悲观锁机制通常是通过使用各种锁类型来实现的。

  • 共享锁(Shared Locks,简称 S 锁):共享锁指的是多个事务可以同时获得对一个相同资源的锁定,这些事务可以读取但不能修改资源。多个共享锁可以共存,各自都可以读取资源,但是不能够对其进行修改,直到所有的共享锁都被释放为止。

  • 排它锁(Exclusive Locks,简称 X 锁):排它锁是指一个事务获得资源的锁定后,其他事务就不能再对该资源进行任何锁定,包括共享锁和排它锁。此时,有排它锁的事务既可以读取也可以修改资源,其他任何事务都没有权限读取和修改这个资源,直到当前事务释放了这个锁。

-- 创建一个 test 表CREATE TABLE `test` (  `id` int(11) NOT NULL AUTO_INCREMENT,  `name` varchar(255) DEFAULT '',  PRIMARY KEY (`id`),) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci;-- 插入数据INSERT INTO `test` (`name`) VALUES ('test');-- session1START TRANSACTION ;-- 获取悲观锁SELECT `name` FROM `test` WHERE `id`=1 FOR UPDATE;-- 执行一些操作...-- 释放悲观锁COMMIT ;-- session2START TRANSACTION ;-- 获取悲观锁SELECT `name` FROM `test` WHERE `id`=1 FOR UPDATE;-- 执行一些操作...-- 释放悲观锁COMMIT ;

上面的示例中,两个 session 都尝试获取 test 表 id 为1的记录的悲观锁,在一个 session 中获取悲观锁后,另一个
session 就必须等待当前 session 结束后才能获取锁,从而实现了数据的排他性。

2. 乐观锁

相对于悲观锁机制而言,乐观锁机制则认为对于同一个数据的并发访问情况是非常少的,因此不会出现数据冲突的情况,从而可以不加锁直接操作该数据。如果没有发现数据冲突,就会成功地进行操作,并且将操作结果更新到数据中;如果发现数据冲突,则会给出相应的提示,并让用户选择相应的处理方式。乐观锁的实现方式通常包括版本号、时间戳、CAS(Compare And Swap)等技术。

-- 创建一个 test 表CREATE TABLE `test` (  `id` int(11) NOT NULL AUTO_INCREMENT,  `name` varchar(255) DEFAULT '',  `version` int(11) DEFAULT '0',  PRIMARY KEY (`id`),) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci;-- 插入数据INSERT INTO `test` (`name`, `version`) VALUES ('test', 0);-- 模拟并发更新-- session1START TRANSACTION ;SELECT @version:=`version` FROM `test` WHERE `id`=1;-- 当前版本号为0-- 延时等待 session2 修改提交-- session2START TRANSACTION ;SELECT @version:=`version` FROM `test` WHERE `id`=1;-- 当前版本号为0,`name` 改为 'test1',`version` 加 1UPDATE `test` SET `name`='test1',`version`=`version`+1 WHERE `id`=1;COMMIT ;-- `test` 表的数据变为(id=1,name='test1',version=1)-- session1-- 修改数据UPDATE `test` SET `name`='test2',`version`=`version`+1 WHERE `id`=1 AND `version`=@version;-- 若修改成功,则 `test` 表的数据变为(id=1,name='test2',version=1);否则修改失败COMMIT ;

在这里插入图片描述

四、MySQL 的锁应用场景

MySQL 中的锁可以应用在很多不同的场景中,下面我们将简要介绍其中的两个常用场景。

1. 精细化控制并发访问

高并发系统中,如果同时有多个事务对某些共享资源进行访问,那么这些事务就会产生资源竞争,容易导致数据出现不一致的情况。因此,在这种情况下,使用 MySQL 的锁机制可以有效地避免资源竞争的出现,保证数据一致性。对于并发访问问题,可以通过使用行级锁定来实现精细化的控制,进而提高数据库的并发处理能力。

2. 防止数据异常处理

在实际开发中,有时候会遇到一些意外情况,导致程序没有正常执行完成就退出,或者其中某些语句卡住,从而影响了后续程序的执行,降低了应用程序的可靠性。这种情况下,如果直接放回一个错误信息或者是空结果,很容易导致数据的异常。因此,使用 MySQL 的锁机制可以避免出现这种情况,保证数据的一致性。在这种情况下,使用排它锁可大大提高 MySQL 数据库的执行效率,同时可以避免出现数据异常情况。
在这里插入图片描述

五、锁小结

MySQL 的锁机制是保证多个并发事务同时访问数据库时数据一致性的重要手段,也是 MySQL 的重要特性之一。在实际开发使用 MySQL 数据库时,了解并掌握 MySQL 的锁机制非常重要,因为不正确的锁机制使用很容易出现严重的性能瓶颈和数据不一致等问题。

MySQL 的锁机制主要包括悲观锁和乐观锁两种。悲观锁机制认为当多个事务访问同一个数据时,一定会发生冲突从而导致数据不一致情况的发生,因此每次访问该数据时都会进行加锁操作,确保该数据的一致性。相比较而言,共享锁更适合在读多写少的场景下使用,而排它锁更适合在写多读少的场景下使用。

总结

综上所述,MySQL 的锁机制可以帮助我们解决多个进程并发访问的问题,保证了数据的安全性和一致性,提高了系统的可靠性。在实际开发中,我们需要根据应用场景具体选择不同类型的锁,避免不必要的资源浪费,提高系统的性能和吞吐量。

来源地址:https://blog.csdn.net/m290345792/article/details/130966965

您可能感兴趣的文档:

--结束END--

本文标题: mysql中的锁浅析

本文链接: https://www.lsjlt.com/news/408411.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • mysql中的锁浅析
    前言 MySQL 锁机制是保证多个并发事务同时访问数据库时数据一致性的重要手段,也是 MySQL 的重要特性之一。在实际开发使用 MySQL 数据库时,了解并掌握 MySQL 的锁机制非常重要,因为...
    99+
    2023-09-15
    mysql 数据库 锁机制
  • MySQL行锁浅析
    概述 MySQL是非常流行的关系型数据库,许多系统都使用它来存储和管理数据。在高并发环境下,为了保证数据的一致性和可靠性,数据库需要实现并发控制,其中包括锁机制。MySQL提供了两种锁类型,一种是表级锁,另一种是行级锁。本文将深入探讨My...
    99+
    2023-08-19
    mysql 数据库 java
  • MySQL中表锁和行锁机制浅析(源码篇)
    目录前言行锁mysql 事务属性事务常见问题事务的隔离级别间隙锁排他锁共享锁分析行锁定行锁优化表锁共享读锁独占写锁查看加锁情况分析表锁定什么场景下用表锁页锁补充:行级锁与死锁总结前言 众所周知,MySQL的存储引擎有My...
    99+
    2024-04-02
  • 深入浅析Java中的 concurrency锁
    本篇文章给大家分享的是有关深入浅析Java中的 concurrency锁,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。根据锁的添加到Java中的时间,Java中的锁,可以分为&...
    99+
    2023-05-31
    java concurrency ava
  • 深入浅析Java中 concurrency的公平锁
    这篇文章给大家介绍深入浅析Java中 concurrency的公平锁,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。释放公平锁(基于JDK1.7.0_40)1. unlock()unlock()在ReentrantLoc...
    99+
    2023-05-31
    java concurrency ava
  • 深入浅析Java中的ReentrantReadWriteLock共享锁
    深入浅析Java中的ReentrantReadWriteLock共享锁?相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。ReadWriteLock 和 ReentrantReadW...
    99+
    2023-05-31
    java reentrantreadwritelock adw
  • 怎样浅析Sql server锁
    怎样浅析Sql server锁,相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。锁有两种分类方法。(1) 从数据库系统的角度来看锁分为以下三种类型...
    99+
    2024-04-02
  • 深入浅析Java中concurrency的非公平锁
    深入浅析Java中concurrency的非公平锁?很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。获取非公平锁(基于JDK1.7.0_40)非公平锁和公平锁在获取...
    99+
    2023-05-31
    java concurrency ava
  • 如何浅析mysql中的double write
    这篇文章给大家介绍如何浅析mysql中的double write ,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。 介绍double write之前我们有必要了解partial pag...
    99+
    2024-04-02
  • MySQL中锁定的示例分析
    这篇文章主要介绍了MySQL中锁定的示例分析,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。 1. 伪事务 前面已经介绍了...
    99+
    2024-04-02
  • 如何浅析MySQL中的binlog和redo
    如何浅析MySQL中的binlog和redo,很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。    有一个...
    99+
    2024-04-02
  • MySQL中表锁,行锁,共享锁,排它锁,间隙锁的示例分析
    小编给大家分享一下MySQL中表锁,行锁,共享锁,排它锁,间隙锁的示例分析,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!锁,在现...
    99+
    2024-04-02
  • MySQL之InnoDB中锁的情况分析
    这篇文章主要讲解了“MySQL之InnoDB中锁的情况分析”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“MySQL之InnoDB中锁的情况分析”吧!mysq...
    99+
    2024-04-02
  • Mysql中select加锁的示例分析
    这篇文章将为大家详细讲解有关Mysql中select加锁的示例分析,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。引言大家在面试中有没遇到面试官问你下面六句Sql的区别呢select *...
    99+
    2023-06-02
  • mysql中更新锁与排它锁的示例分析
    这篇文章将为大家详细讲解有关mysql中更新锁与排它锁的示例分析,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。一直没有认真了解UPDATE操作的锁,最近在MSDN...
    99+
    2024-04-02
  • MySQL中InnoDB锁机制分析
    本篇内容介绍了“MySQL中InnoDB锁机制分析”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成! ...
    99+
    2024-04-02
  • Mysql中行级锁的示例分析
    小编给大家分享一下Mysql中行级锁的示例分析,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧! 我们首...
    99+
    2024-04-02
  • MySQL中的锁(表锁、行锁)
    锁是计算机协调多个进程或纯线程并发访问某一资源的机制。在数据库中,除传统的计算资源(CPU、RAM、I/O)的争用以外,数据也是一种供许多用户共享的资源。如何保证数据并发访问的一致性、有效性是所在有数据库必须解决的一个问题,锁冲突也是影响数...
    99+
    2023-09-02
    java 算法 数据库
  • Mysql中undo、redo与binlog的区别浅析
    目录前言【undo log】 【redo log】 【binlog】 总结前言 MySQL中有六种日志文件,分别是:重做日志(redo log)、回滚日志(undo log)、二进制...
    99+
    2024-04-02
  • MySQL中如何浅析interactive_timeout和wait_timeout
    本篇文章给大家分享的是有关MySQL中如何浅析interactive_timeout和wait_timeout,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编...
    99+
    2024-04-02
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作