Mysql事务中Update是否会锁表?

yizhihongxing

在 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日

相关文章

  • redis性能优化之生产中实际遇到的问题及排查总结

    Redis性能优化之生产中实际遇到的问题及排查总结 Redis是一种快速、高效的内存存储数据库系统,但是在实际生产中,我们可能会遇到一些性能问题,比如读写性能下降、集群拓扑变化导致的性能问题、持久化过程中的性能问题等。接下来我们将结合实际示例,总结一下Redis在生产中常见的性能问题以及解决方案。 读写性能下降 问题描述 在Redis运行一段时间之后,我们发…

    database 2023年5月22日
    00
  • Oracle Faq(Oracle的版本)

    Oracle FAQ(Oracle的版本) Oracle是一种流行的关系型数据库管理系统,它广泛应用于企业级应用程序和网站中。Oracle FAQ是Oracle数据库技术问答集,其中包含了一些常见问题的答案。在本篇攻略中,我们将详细讲解Oracle FAQ,并提供一些示例说明。 问题分类 Oracle FAQ包含了各种类型的问题和答案。其中包括但不限于以下类…

    database 2023年5月22日
    00
  • Oracle基础:程序中调用sqlplus的方式

    【Oracle基础:程序中调用sqlplus的方式攻略】 在Oracle数据库开发中,有时候需要在程序中调用Sqlplus命令行工具,这个过程可以使用Java、Shell等语言实现。下面详细讲解如何在程序中调用Sqlplus命令行工具。 1、使用Java语言实现 Java程序中可以通过ProcessBuilder来调用操作系统命令行工具。下面是Java程序调…

    database 2023年5月21日
    00
  • 分享Oracle 11G Client 客户端安装步骤(图文详解)

    分享Oracle 11G Client 客户端安装步骤(图文详解) 如果你需要在本地计算机上连接Oracle 11G数据库,首先需要在本地计算机上安装Oracle 11G Client。这里提供了安装Oracle 11G Client客户端的详细步骤。 步骤1:下载Oracle 11G Client 首先需要在Oracle官方网站上下载Oracle 11G …

    database 2023年5月22日
    00
  • Centos7安装 mysql5.6.29 shell脚本

    CentOS 7 安装 MySQL 5.6.29 可以分为以下三个步骤: 添加 MySQL 5.6.29 Yum 源; 安装 MySQL 5.6.29; 配置 MySQL。 下面分步骤进行说明,要求使用 root 用户登录。 一、添加 MySQL 5.6.29 Yum 源 MySQL 5.6.29 是通过 MySQL 官方 Yum 源进行安装的,在 Cent…

    database 2023年5月22日
    00
  • MySQL系列之十五 MySQL常用配置和性能压力测试

    MySQL系列之十五 MySQL常用配置和性能压力测试 一、配置文件常用参数 在MySQL的配置文件(my.cnf)中,我们常常需要设置以下几个参数: key_buffer_size:用于缓存索引和键值对应的页面大小,影响索引的查询速度。 query_cache_size:查询缓存大小,如果查询被缓存,则可以加快查询速度,但可能会导致缓存失效率崩溃而且内存占…

    database 2023年5月22日
    00
  • MySQL模糊查询用法大全(正则、通配符、内置函数)

    MySQL模糊查询功能是SQL语句中非常重要的功能之一,它可以帮助用户在数据库中查找匹配的数据。总体来说,MySQL模糊查询有三种方式:正则表达式、通配符和内置函数,下面分别进行详细讲解。 正则表达式 正则表达式语法通常用于字符串处理,包括模式匹配和搜索等操作。MySQL通过使用正则表达式的语法,可以进行更为高效精准的匹配和查询。 常见的正则表达式符号: ^…

    database 2023年5月22日
    00
  • PHP中PDO事务处理操作示例

    下面是关于PHP中PDO事务处理操作示例的完整攻略。 什么是PDO事务处理 在PHP中,使用PDO对数据库进行操作时,设置事务可以确保多个操作顺利执行或者回滚。事务可以理解为一组原子操作,要么全部执行,要么全部不执行。如果其中一个操作有错误,所有操作都将被回滚。可以避免数据一致性问题。 PDO事务操作示例 1. 开始事务,执行所有SQL语句,然后提交事务 t…

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