一篇文章带你了解清楚Mysql 锁

一篇文章带你了解清楚Mysql 锁

什么是锁

在多线程并发操作一个资源时,为了保证操作的正确性,需要对资源进行加锁控制。锁是用来保证共享数据或共享资源在多线程或多进程中能够安全访问的一种机制。在 MySQL 中,锁是在查询过程中对数据进行加锁以保证数据的一致性。

锁的分类

MySQL 中锁的分类有多种,这里简单介绍一下 InnoDB 中的三种锁:共享锁、排他锁和意向锁。

共享锁(Shared Lock)

共享锁可被多个线程同时持有,用来保证读的一致性。这意味着如果一个线程持有了一个共享锁,在该锁被释放之前,其他线程只能再获取到共享锁,而不能获取排他锁。其他线程因为需要对锁的改变产生的冲突而无法获取到排他锁。
示例:

session1> start transaction;

session1> select * from table_name where id=1 lock in share mode;

session2> start transaction;

session2> select * from table_name where id=1 lock in share mode;  # 这条命令能执行成功

session3> start transaction;

session3> update table_name set name='new_name' where id=1;    # 由于 session1 已经获取了行级共享锁,所以这条命令会一直等待,直到 session1 结束事务

排他锁(Exclusive Lock)

排他锁被获取后,其他请求的共享锁与排他锁都无法被获取,直到排他锁被释放。用来实现对数据的修改操作,在该锁被获取到之前,其他线程无法操作该行。
示例:

session1> start transaction;

session1> select * from table_name where id=1 for update;

session2> start transaction;

session2> select * from table_name where id=1 for update;  # 这条命令无法执行成功,一直等待 session1 结束事务

session3> start transaction;

session3> update table_name set name='new_name' where id=1;    # 由于 session1 已经获取了行级排他锁,所以这条命令会一直等待,直到 session1 结束事务

意向锁(Intent Lock)

InnoDB 存储引擎中的锁具有层级关系,需要使用意向锁和间隙锁来管理多个锁之间的关系。意向锁是一种表级锁,它表示一个事务占用了一个表中某个记录的行级别锁或者间隙锁。意向锁分为意向共享锁和意向排他锁,分别代表需要获取共享锁或排他锁。在事务需要获取行级锁之前,必须先获取表级别的意向锁。
示例:

session1> start transaction;

session1> select * from table_name where id=1 for update;

session2> start transaction;

session2> lock table table_name write;

session2> unlock tables;

session3> start transaction;

session3> insert into table_name (id, age, name) values (2,20,'lucy');  # 这条命令由于需要获取行级排他锁,但是由于 session1 已经获取了行级排他锁,所以会一直阻塞,直到 session1 结束事务

总结

游走于事务与隔离级别之间的锁机制更是整个 RDBMS 数据库系统中最核心的设计之一。正确使用锁机制可以大大提升数据系统的并发能力,提高数据的安全性。

更加深入的了解锁,可以参考 MySQL 官方文档:https://dev.mysql.com/doc/refman/8.0/en/innodb-locking.html

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:一篇文章带你了解清楚Mysql 锁 - Python技术站

(0)
上一篇 2023年5月22日
下一篇 2023年5月22日

相关文章

  • 基于Spring Boot使用JpaRepository删除数据时的注意事项

    简介 Spring Boot是一个快速开发框架,可以帮助开发人员开发高效率的Web应用程序。在使用Spring Boot和JpaRepository删除数据时,可能会遇到一些问题,因此需要注意一些细节。 调用JpaRepository删除数据示例 在调用JpaRepository删除数据时,需要注意一下几点:- 通过JpaRepository进行删除操作时,…

    database 2023年5月22日
    00
  • CouchDB 和 MariaDB 的区别

    CouchDB和MariaDB都是常见的数据库管理系统,但它们有很多区别。下面详细讲解CouchDB和MariaDB之间的区别。 1. 数据存储方式的差异 CouchDB和MariaDB的存储方式有很大的不同。CouchDB使用了文档数据库的概念,它能够将自己的数据存储成JSON格式的文档并支持多种查询方式。这种存储方式使得CouchDB更加适合于处理非结构…

    database 2023年3月27日
    00
  • 详细介绍windows下MySQL安装教程

    详细介绍windows下MySQL安装教程 MySQL是目前世界上最流行的开源关系型数据库管理系统,常被用来作为网站后台数据管理和存储的解决方案。在Windows操作系统下,安装MySQL可以实现本地开发环境的搭建,为后续的应用程序开发提供基础支持。以下是详细的MySQL安装教程: 下载MySQL安装包 首先,从MySQL官网https://dev.mysq…

    database 2023年5月22日
    00
  • 以数据库字段分组显示数据的sql语句(详细介绍)

    下面是关于“以数据库字段分组显示数据的SQL语句”的完整攻略: 1. SQL语句介绍 MySQL中,使用GROUP BY子句可以将查询结果按照指定字段进行分组并显示聚合函数的统计值,如COUNT、SUM、AVG等。GROUP BY子句一般与SELECT和FROM子句一起使用,用于指定分组字段。 GROUP BY子句的基础语法如下: SELECT field1…

    database 2023年5月21日
    00
  • Oracle在PL/SQL中使用子查询

    下面是Oracle在PL/SQL中使用子查询的完整攻略,包含基本概念、语法、示例说明等。 基本概念 子查询是一个嵌套在另一个查询语句中的查询语句。它的结果可作为在 SELECT 、INSERT、UPDATE 、DELETE 等语句中使用,与表名类似(省略FROM),一般出现在WHERE子句中。 在PL/SQL中,子查询可以用于多个地方,包括: WHERE 子…

    database 2023年5月21日
    00
  • Oracle中sql语句如何执行日志查询

    Oracle中的SQL语句执行日志查询可以通过以下步骤来完成: 1. 开启SQL Trace跟踪 在开启SQL Trace跟踪前需要确认以下事项:- 需要有ALTER SESSION权限- 需要对要跟踪的会话打开跟踪标识 具体步骤如下:- 开启跟踪标识:ALTER SESSION SET SQL_TRACE=TRUE;- 执行目标SQL语句- 关闭跟踪标识:…

    database 2023年5月21日
    00
  • C#编程实现连接SQL SERVER数据库实例详解

    C#编程实现连接SQL SERVER数据库实例详解 在C#编程中,连接数据库是非常常见的操作。本文将详细讲解如何使用C#编程实现连接SQL SERVER数据库的过程。 步骤 1. 引用命名空间 在C#程序中,我们首先需要引用System.Data.SqlClient命名空间,以使用SQL Server相关的类和方法。 using System.Data.Sq…

    database 2023年5月21日
    00
  • 如何使用Python实现数据库中数据的批量更新?

    以下是使用Python实现数据库中数据的批量更新的完整攻略。 数据库中数据的批量更新简介 在数据库中,批量更新是一次性更新多条记录。在Python中,可以使用pymysql连接MySQL数据库,并UPDATE语句实现批量更新。 步骤1:连接到数据库 在Python中,可以使用pymysql连接MySQL数据库以下是连接到MySQL的基本语法: import …

    python 2023年5月12日
    00
合作推广
合作推广
分享本页
返回顶部