MySQL InnoDB的3种行锁定方式

MySQL InnoDB引擎提供了三种行锁定方式:共享锁(S锁)、排它锁(X锁)和意向锁(IS锁和IX锁)。

共享锁(S锁)

共享锁(S锁)是用来保证读取的数据在事务间的一致性。多个事务可以同时获取共享锁定,因为他们都只是读取数据而不做任何修改。但是,一个事务获取了共享锁之后,其他事务便不能再对该行加排它锁。

语法:SELECT ... FOR SHARE

例如,假设有一个表t,其中包含字段a和b。两个事务A和B分别执行以下语句:

事务A:SELECT * FROM t WHERE a=1 FOR SHARE;
事务B:SELECT * FROM t WHERE a=1 FOR SHARE;

由于两个事务使用了共享锁定,所以它们都可以查询到字段a=1的行并读取其数据,但是没有一个事务可以对这些行进行修改操作。如果其中一个事务尝试修改这些行,则需要等待另一个事务释放它的共享锁。

2. 排它锁(X锁)

排它锁(X锁)是用来在事务中修改数据的。同一时刻只有一个事务可以获取排它锁。其他非当前事务的读写操作都需要等待排它锁释放。也就是说,如果一个事务A想要对一个行进行修改,那么它必须先获取对应的排它锁,否则就需要等待。

语法:SELECT ... FOR UPDATE

例如,假设有一个表t,其中包含字段a和b。两个事务A和B分别执行以下语句:

事务A:SELECT * FROM t WHERE a=1 FOR UPDATE;
事务B:SELECT * FROM t WHERE a=1 FOR UPDATE;

由于只有一个事务可以获取排它锁,所以事务B需要等待事务A释放排它锁后才能获取它。

意向锁(IS锁和IX锁)

意向锁(IS锁和IX锁)是用来在表级别上管理行级别锁的。在获取行级别锁之前,必须先获取表级别上的意向锁,在释放行级别锁之后,也需要同样先释放表级别上的意向锁。

意向锁分为两种类型:IS锁和IX锁。

IS锁意味着一个锁定的事务想要在一个表的行上增加共享锁定。IX锁,是一个锁定事务想要在表的行上增加排它锁。

在关于行的锁定之前,在表上增加一个意向锁。如果一个进程想要取出某行的共享锁定,那么MySQL检查表上是否已有一个意向锁,并检查该锁是否为IS。如果是,那么该进程可以在该行上加共享锁定。如果该表有一个IX意向锁,则MySQL允许进程取出排它锁。同样,如果进程想要取出排它锁,那么MySQL会检查该表上是否有一个IX意向锁。

语法:LOCK IN SHARE MODEFOR UPDATE已经隐含了意向锁。

例如,假设有一个表t,其中包含字段a和b。事务A执行以下语句对表t上锁定:

LOCK TABLE t WRITE;

此时,在事务A释放锁定之前,其他事务T1和T2无法对表t进行任何读写操作,它们会被阻塞。

总之,MySQL InnoDB引擎提供了三种行锁定方式:共享锁(S锁)、排它锁(X锁)和意向锁(IS锁和IX锁)。开发人员可以根据实际需求选择适当的锁定方式以保证数据的一致性和安全性。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:MySQL InnoDB的3种行锁定方式 - Python技术站

(0)
上一篇 2023年3月10日
下一篇 2023年3月10日

相关文章

  • MySQL表操作插入数据insert语句学习(小白入门篇)

    MySQL表操作插入数据insert语句学习(小白入门篇) 什么是insert语句? 在MySQL中,我们需要使用insert语句来向表中插入新的数据。我们可以使用insert语句指定要插入数据的列和相应的值。 语法 INSERT INTO table_name (column1, column2, column3, …) VALUES (value1,…

    database 2023年5月22日
    00
  • 运维老鸟谈生产场景对linux系统进行分区的方法

    下面是运维老鸟谈生产场景对Linux系统进行分区的方法的攻略: 一、背景介绍 在Linux系统中,磁盘分区是一项非常重要的工作,它关系到系统的性能和稳定性。在实际生产中我们需要针对不同的应用场景进行合理的分区,以用于合理地满足不同的需求。在进行分区规划时,需要根据自己的实际情况综合考虑磁盘容量和性能等多方面的因素。 二、分区方案 2.1 建议切分的分区 /b…

    database 2023年5月22日
    00
  • 详细讲解安全升级MySQL的方法

    详细讲解安全升级MySQL的方法 在对MySQL进行安全升级时,应该按照以下步骤进行: 1.备份 在进行任何操作之前,一定要进行数据库备份,以确保在升级过程中出现问题时可以恢复数据。可使用以下命令进行备份: $ mysqldump -u root -p –all-databases > all_databases.sql 2.检查当前MySQL版本 …

    database 2023年5月19日
    00
  • MyBatis如何配置多sql脚本执行

    配置多个SQL脚本在MyBatis中的执行需要进行如下步骤: 创建多个SQL脚本文件,可以使用文件名为标识符,例如user.sql和order.sql。 在MyBatis配置文件mybatis-config.xml中定义多个SqlSessionFactory,每个SqlSessionFactory对应一个SQL脚本文件。 <configuration&…

    database 2023年5月21日
    00
  • MySQL百万级数据分页查询优化方案

    MySQL百万级数据分页查询优化方案 当数据量变得越来越大时,如何优化查询分页的速度成为挑战。以下是优化MySQL百万级数据分页查询的完整攻略。 数据库设计方案 优化表结构,把一个表的数据拆成多个表,降低表的数据量; 使用分区表,对每个分区表进行分页查询; 使用缓存技术,将常用的数据缓存到内存中,减少查询数据库的次数。 ## SQL查询优化 合理设计SQL语…

    database 2023年5月19日
    00
  • 详解MySQL系统变量的查看和修改

    MySQL系统变量是MySQL服务器的某些配置参数,可以通过查看和修改这些变量来调整服务器的行为或优化性能。本文将详细介绍MySQL系统变量的查看和修改方式,并结合实例说明。 查看MySQL系统变量 通过SHOW VARIABLES命令查看MySQL系统变量 在MySQL命令行客户端中,使用“SHOW VARIABLES”命令可以列出当前MySQL服务器的所…

    MySQL 2023年3月9日
    00
  • sqlplus登录\连接命令、sqlplus命令的使用大全

    以下是关于”sqlplus登录\连接命令、sqlplus命令的使用大全”的一份完整攻略: SQLPlus登录\连接命令 1. 语法 sqlplus [用户名]/[密码]@[连接串] 用户名:指数据库中已创建的用户的名称,没有指定默认为SYS用户; 密码:指该用户的密码; 连接串:指连接到的数据库实例的系统名称,格式为”[主机名]:[端口号]/[服务名]” 2…

    database 2023年5月21日
    00
  • MYSQL—主从同步概述与配置

    一、MYSQL主从同步概述 1、什么是MySQL主从同步? 实现数据自动同步的服务结构 主服务器(master): 接受客户端访问连接 从服务器(slave):自动同步主服务器数据 2、主从同步原理 Maste:启用binlog 日志Slave:Slave_IO: 复制master主机binlog 日志文件的SQL命令到本机的relay-log(中继日志) …

    MySQL 2023年4月22日
    00
合作推广
合作推广
分享本页
返回顶部