Mysql事务中Update是否会锁表?

在 MySQL 中,事务是一组被视为单一单位的 SQL 语句,这些语句要么全部执行,要么全部不执行。当在事务中进行数据修改操作时,往往需要了解这些操作是否会锁表,特别是在高并发的情况下,避免因锁表而导致性能下降或失误。下面分别针对 Update 是否会锁表进行详细讲解。

Update 是否会锁表?

MySQL 的 InnoDB 存储引擎采用了多版本并发控制(MVCC)的机制,对一张表中的数据进行修改时,一般情况下不会锁整张表,而只会锁定需要修改的行。而 MySQL 的 MyISAM 存储引擎则不支持行级锁,一般是采用表级锁来完成数据修改的操作,会锁定整张表,影响性能。

MVCC机制的基本运作原理

多版本并发控制(MVCC)是基于并发控制理论发展而来的。它的基本思想是:不同事务之间不必相互等待,可以在不影响彼此的情况下并发执行,并通过读取数据的历史版本来实现数据一致性。

MVCC 机制可以通过两种方式判断一个事务是否可以执行修改操作:

  • 基于版本号:在每一行记录中增加一个版本号,每次事务更新记录时,将版本号递增,同时在事务提交时保存其最终版本号。在读取数据时,只返回比当前事务版本小(包括已提交事务和未提交事务)的数据快照,并判断该事务是否可以修改数据。

  • 基于快照:在读取某一行数据的快照时,保存当前行最近一个版本的数据副本,并判断该数据是否被其他事务修改。若没有,返回该快照;若已经被修改,则根据事务隔离级别使用不同的并发控制机制(如加锁等)来避免冲突。

Update 是否会锁表的分析

基于 MVCC 机制的运作原理,我们可以得出以下结论:

  • 对于 MyISAM 表:由于其不支持行级锁,故进行 Update 操作时会对整张表进行锁定,会形成表级锁,在高并发的情况下极易引起锁冲突,降低系统性能和并发性。

  • 对于 InnoDB 表:由于其支持行级锁,并且采用 MVCC 机制来实现数据一致性,故进行 Update 操作时一般不会锁定整张表,而只会锁定需要修改的行。具体的操作方式如下:

  • 当执行 Update 语句时,会根据语句的 where 条件选择被修改的行,并将其标记为“删除”状态,同时创建一条新的记录来保存修改后的数据。

  • 当其他事务请求读取这些记录时,InnoDB 引擎会检查该事务的隔离级别,并根据其要求返回对应版本的数据快照。具体的快照版本有以下两种:

    • 读已提交:快照版本要求比当前事务的事务 ID 小,这表明当前事务可以读取任何已提交的记录,并且不会读到未提交的记录。

    • 可重复读和序列化:快照版本要求访问该行之前的某个版本,只有在该版本之前没有任何正在执行的事务才能读取该行记录。

综上所述,InnoDB 表的 Update 不会锁表,而只会锁定需要修改的行。

示例说明

示例1:MyISAM 表中的 Update 操作锁表

-- 创建 MyISAM 表
CREATE TABLE mytable (
  id INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
  name VARCHAR(255) NOT NULL
) ENGINE=MyISAM;

-- 插入测试数据
INSERT INTO mytable (name) VALUES ('test1'), ('test2'), ('test3');

-- 开启两条事务,分别执行更新操作和查询操作
-- 由于 MyISAM 不支持行级锁,故会锁定整张表,导致更新操作阻塞
-- 需要等待查询操作结束后才能释放锁,降低了并发性能
START TRANSACTION;
  UPDATE mytable SET name = 'test4' WHERE id = 1;
  -- 在前一个事务还未提交的情况下查询表记录,会被阻塞
  SELECT COUNT(*) FROM mytable WHERE name = 'test4';
COMMIT;

示例2:InnoDB 表中的 Update 不锁表

-- 创建 InnoDB 表
CREATE TABLE mytable (
  id INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
  name VARCHAR(255) NOT NULL
) ENGINE=InnoDB;

-- 插入测试数据
INSERT INTO mytable (name) VALUES ('test1'), ('test2'), ('test3');

-- 开启两条事务,分别执行更新操作和查询操作
-- 由于 InnoDB 支持行级锁,故不会锁定整张表,提高了并发性能
START TRANSACTION;
  UPDATE mytable SET name = 'test4' WHERE id = 1;
  -- 在前一个事务还未提交的情况下查询表记录,不会被阻塞
  SELECT COUNT(*) FROM mytable WHERE name = 'test4';
COMMIT;

通过以上两个示例可以看出,在 MyISAM 表中进行 Update 操作时会锁定整张表,而 InnoDB 表则不会锁定整张表,只会锁定需要修改的行。因此,在事务中进行修改操作时,应该尽可能地使用 InnoDB 存储引擎来避免锁表带来的性能问题。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Mysql事务中Update是否会锁表? - Python技术站

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

相关文章

  • centos6.4下mysql5.7.18安装配置方法图文教程

    CentOS 6.4下MySQL 5.7.18安装配置方法图文教程 简介 MySQL是现今最流行的关系型数据库管理系统之一,而CentOS是一个基于Linux的操作系统,本文将介绍在CentOS 6.4下安装MySQL 5.7.18的完整步骤。 步骤 1. 下载MySQL安装包 从MySQL官方网站下载MySQL 5.7.18的二进制安装包(tar.gz格式…

    database 2023年5月22日
    00
  • mysql insert的几点操作(DELAYED,IGNORE,ON DUPLICATE KEY UPDATE )

    MySQL中的INSERT语句用于将数据插入到表中。在插入过程中,我们还可以使用一些额外的参数,来控制INSERT的行为。其中包括:DELAYED、IGNORE和ON DUPLICATE KEY UPDATE。 接下来,我们分别来详细讲解一下这三种参数的使用方法,以及给出示例说明。 DELAYED DELAYED关键字可以被用于INSERT语句中,表示该插入…

    database 2023年5月22日
    00
  • MySQL DELETE语法使用详细解析

    MySQL DELETE语法使用详细解析 DELETE语句常用于删除MySQL表中的一条或多条记录。在本文中,将为您详细介绍MySQL DELETE语法。 语法 以下是MySQL DELETE语法的基本结构: DELETE FROM table_name WHERE condition; 其中,table_name是要删除数据的表的名称,condition是…

    database 2023年5月22日
    00
  • mysql视图之创建视图(CREATE VIEW)和使用限制实例详解

    当我们需要从数据库中查询某些数据时,有时候我们需要的数据需要从多个表中关联查询,这时就可以使用mysql视图,mysql视图就是一种虚拟的表,它并不真实存在于数据库中,但是我们可以查询它,它是由一条或者多条SELECT语句组成的,查询它就相当于执行这些SELECT语句。 创建视图 我们可以使用CREATE VIEW语句来创建视图,CREATE VIEW语句的…

    database 2023年5月21日
    00
  • SQL 删除全表记录

    要删除一张表中所有的记录,可以使用 SQL 中的 DELETE 语句结合 WHERE 子句来完成。下面是SQL删除全表记录的完整攻略: 步骤一:备份表格数据 在执行 DELETE 语句之前,建议您先备份整张表的数据。这一步虽然不是必需的,但是如果不小心误删了数据,备份数据可以方便地帮助您找回丢失的数据。 步骤二:使用 DELETE 语句删除表格数据 执行 D…

    database 2023年3月27日
    00
  • C# 启动 SQL Server 服务的实例

    C# 启动 SQL Server 服务的实例可以通过使用.NET Framework的System.ServiceProcess命名空间中的ServiceController类来实现。下面是步骤: 步骤一:添加System.ServiceProcess引用 使用Visual Studio或其他IDE创建一个新的控制台应用程序项目。接下来,我们需要在项目中添加…

    database 2023年5月21日
    00
  • DBMS 架构

    DBMS(Database Management System)是数据库管理系统的缩写。DBMS的设计架构包含了多个组件,主要分为三个层次:外层、中间层和内层。 外层 外层是用户交互的界面。在这里用户可以使用SQL语言来访问和管理数据库。外层主要包括两个组件:SQL解析器和优化器。 SQL解析器用来解释用户提交的SQL查询语句,将其转化为DBMS内部能够理解…

    database 2023年3月27日
    00
  • SQL 创建水平直方图

    当需要可视化数据分布时,水平直方图是一种有效的方式。以下是使用SQL创建水平直方图的完整攻略,包含两条实例。 准备数据 在进行水平直方图绘制之前,需要准备数据,下面创建一个示例表: CREATE TABLE sales ( salesperson varchar(50), amount decimal(10, 2) ); INSERT INTO sales(…

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