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中(JOIN/ORDER BY)语句的查询过程及优化方法

    下面是关于“MySQL中(JOIN/ORDER BY)语句的查询过程及优化方法”的详细讲解攻略。 一、JOIN语句的查询过程及优化方法 1.1 JOIN语句的查询过程 JOIN语句是通过连接两张或多张表中的数据来产生结果的,它的查询过程主要分为以下两个步骤: 根据连接条件,从前面的表中查找符合条件的行; 对于前面查找出的每一行,在后面的表中查找符合条件的行,…

    MySQL 2023年5月19日
    00
  • AngularJs和谷歌Web Toolkit (GWT)的区别

    AngularJS和谷歌Web Toolkit(GWT)虽然都是由谷歌开发的,但是它们在使用方式和应用场景上存在一些不同。下面是它们的区别详细说明。 AngularJS AngularJS是一款由谷歌开发的JavaScript框架,用于Web应用程序开发。它是一个基于MVC(Model View Controller)架构的声明式编程模型,通过所谓的指令定义…

    database 2023年3月27日
    00
  • Linux mysql-5.6如何实现重置root密码

    当你忘记了mysql的root密码时,可以通过下面的步骤来重置密码: 1. 停止mysql服务 使用以下命令停止mysql服务。 # Ubuntu 或者 Debian sudo /etc/init.d/mysql stop # CentOS 或者 Red Hat sudo systemctl stop mysqld 2. 以系统管理员身份运行mysql 以系…

    database 2023年5月22日
    00
  • asp经典入门教程 在ASP中使用SQL 语句第2/2页

    下面我来详细讲解“ASP经典入门教程 在ASP中使用SQL语句第2/2页”的完整攻略。 1. 概述 “ASP经典入门教程 在ASP中使用SQL语句第2/2页”是一篇教程,主要介绍如何在ASP中使用SQL语句,包括连接数据库、查询数据、更新数据等操作。本文分为两部分,第一部分主要介绍连接数据库的方法,第二部分则介绍如何使用SQL语句进行查询和更新操作。 2. …

    database 2023年5月21日
    00
  • linux下自动备份MySQL数据并上传到FTP上的shell脚本

    下面是详细的攻略: 1. 确定备份方式 在linux下备份MySQL数据,并上传到FTP上,一般有两种途径: 1.1. mysqldump备份 该方法是最常见的备份MySQL数据的方法,可以将MySQL的表结构和数据导出为一个.sql文件。通过该方法备份MySQL数据的示例代码如下: #!/bin/bash # 备份的数据库名 db_name="m…

    database 2023年5月22日
    00
  • RDBMS 和 Hive 的区别

    RDBMS(Relational Database Management System)和Hive都是用于存储和管理结构化数据的工具。但是,在它们之间有很多的不同点。 RDBMS和Hive的定义 RDBMS是指传统的关系型数据库,如MySQL、Oracle等,它们以表格的形式存储数据,并使用结构化查询语言(SQL)来处理数据。 Hive是一个基于Hadoop…

    database 2023年3月27日
    00
  • SQL Server视图的讲解

    下面我将为你详细讲解“SQL Server视图的讲解”的完整攻略。 什么是视图? 视图是 SQL Server 数据库中的一个概念,是基于一个或多个表的查询创建的虚拟表,视图与物理表很相似,但是它并不实际存在于数据库中,只是一个逻辑表。 视图的作用 通过视图我们可以很方便的隐藏表中的某些列,或者过滤掉一些特定的记录,从而简化复杂的 SQL 查询,提高查询效率…

    database 2023年5月21日
    00
  • 浅析Oracle体系结构

    浅析 Oracle 体系结构 Oracle 数据库在设计上采用了典型的客户机/服务器 (C/S) 模式,逻辑上分为三层:客户端、数据库服务层和数据库存储层。具体讲解如下: 客户端 客户端即连接到服务器的终端设备,它提供操作 Oracle 数据库的可视化界面,包括 SQL*Plus 命令行界面、Oracle SQL 开发工具、Oracle Forms、PL/S…

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