首页 > 数据库 >MySQL的行锁和表锁机制

MySQL的行锁和表锁机制

时间:2023-10-11 16:36:11浏览次数:42  
标签:事务 锁定 行锁 并发 MyISAM MySQL 表锁

一、引言

​ 在数据库管理系统中,锁是用来控制对数据的访问的机制MySQL 既支持行级锁(Row-level Locking),也支持表级锁(Table-level Locking)

​ MySQL引擎中,MyISAM不支持行锁,而InnoDB支持行锁和表锁。


二、行锁(Row-level Locking)

​ 行锁是指对数据表中的一行记录进行锁定,其他事务需要等待该锁释放才能访问被锁定的行。行锁可以提高并发性,不同的事务可以同时锁定不同的行,从而避免了对整个表的锁定。

  • 优点

    • 高并发性:不同事务可以同时锁定不同行,从而提高了数据库的并发性能。
    • 精确控制: 只锁定需要操作的行,避免了无谓的锁竞争,降低了锁冲突的概率。
  • 缺点

    • 内存消耗: 行锁需要维护每一行的锁信息,会占用一定的内存空间。
    • 性能开销: 锁管理的细粒度导致了额外的性能开销,例如死锁检测等。
    • 锁竞争: 当大量事务同时访问不同行时,仍然可能出现锁竞争问题。
  • 注意:

    1. 行锁必须有索引才能实现,否则会自动锁全表,那么就不是行锁了。
    2. 两个事务不能锁同一个索引。
    3. insert,delete,update在事务中都会自动默认加上排它锁。

三、表锁(Table-level Locking)

​ 表锁是指对整个数据表进行锁定,当一个事务锁定了表后,其他事务需要等待该锁释放才能访问整个表。表锁是一种较粗粒度的锁。(表共享读锁、表独占写锁)

  • 优点

    • 简单: 实现相对简单,不需要维护大量的锁信息。
    • 节省内存: 只需要维护表级的锁信息,节省了内存开销。
  • 缺点

    • 低并发性: 表锁限制了并发性,当一个事务锁定了表后,其他事务无法并行访问。
    • 锁竞争: 表级锁导致多个事务之间的锁竞争增加,可能出现更多的死锁问题。
    • 性能瓶颈: 在高并发情况下,表级锁可能成为性能瓶颈,限制了系统的吞吐量。
  • 读锁会阻塞写,写锁会阻塞读和写

    • 对MyISAM表的读操作,不会阻塞其它进程对同一表的读请求,但会阻塞对同一表的写请求。只有当读锁释放后,才会执行其它进程的写操作。
    • 对MyISAM表的写操作,会阻塞其它进程对同一表的读和写操作,只有当写锁释放后,才会执行其它进程的读写操作。

四、如何选择

在选择行锁还是表锁时,需要根据具体的业务场景来决定:

  • 行锁: 适用于高并发、细粒度的操作,能够提供更好的并发性能,但可能会引入更多的锁管理开销。
  • 表锁: 适用于简单的操作,能够减少锁管理开销,但并发性能较差。

综合考虑,通常情况下优先选择行锁,只有在特定情况下(例如大量的读操作或简单的数据操作)才考虑使用表锁。


五、如何加锁

​ MyISAM在执行查询语句(SELECT)前,会自动给涉及的所有表加读锁,在执行更新操作(UPDATE、DELETE、INSERT等)前,会自动给涉及的表加写锁,这个过程并不需要用户干预,因此用户一般不需要直接用LOCK TABLE命令给MyISAM表显式加锁

  • 共享锁(读锁)lock in share mode

    select 字段 from 表名 where 条件 lock in share mode;
    
  • 排它锁(写锁)for update

    select 字段 from 表名 where 条件 for update;
    

参考资料:https://blog.csdn.net/lanzhupi/article/details/109740544;

https://blog.csdn.net/xts5701046/article/details/81395958


标签:事务,锁定,行锁,并发,MyISAM,MySQL,表锁
From: https://www.cnblogs.com/Enid/p/17757536.html

相关文章

  • mysql 中 timestampdiff 一个让人费解的问题
    取当前时间 使用上面取到的时间与now()使用timestampdiff进行month级别比较 将上面取到的日期递增一个月再次比较 结果让人很费解 在此给自己提个醒,mysql单纯使用日期还是用 current_date吧......
  • 在Ubuntu22.04上安装MySQL-Server,并配置可视化界面SQL-Workbench
    在Ubuntu22.04上安装MySQL-Server,并配置可视化界面MySQL-Workbench彻底删除MySQL若您是首次,在Ubuntu22.04上崭新安装mysql,可以略过该步。首先卸载mysql-common:sudoapt-getremovemysql-common然后卸载已经安装的mysql-server:sudoapt-getautoremove--purgemysql-ser......
  • mysql插入数据时遇到的问题
    1、 Illegalmixofcollations(latin1_swedish_ci,IMPLICIT)and(utf8mb4_general_ci,COERCIBLE)foroperation'=' 解决:原因:因为新创建的表字符集是latin1_swedish_ci,而原有的字符集需要utf8mb4_general_ci,所以报错。ALTERTABLE表名CONVERTTOCHARACTER......
  • Debian12安装MySQL8实践及问题解决方案
    Debian12安装MySQL数据库,常规操作:sudoaptsearchmysql&sudoaptinstallmysql,肯定是行不通的,因为没有安装包。把我的安装过程以及遇到问题的解决方案记录下来,供大家借鉴。第一步更新系统、下载软件包命令如下:sudoaptupdatewgethttps://dev.mysql.com/get/mysql-apt-co......
  • MySQL使用cmd窗口命令导入数据库
    如下:setgloballog_bin_trust_function_creators=1;--导入数据库之前做准备SETGLOBALlog_bin_trust_function_creators=TRUE;cmd命令窗口执行如下导入命令命令行登录mysqlmysql-uroot-pxxx;mysql>usedatabasename;mysql>sourced:/xxx.sqlend......
  • MySQL高级
    前言:本篇文章是本人学习MySQL高级的笔记。资料:《MySQL是怎样运行的》、《小林Coding-图解MySQL》、《MySQL45讲》、《尚硅谷康师傅MySQL视频》一、基础篇1.什么是关系型数据库?关系型数据库是指采用了关系模型来组织数据的数据库,其以行和列的形式存储数据,一系列的行和列被......
  • MYSQL数据备份之mysqldump命令详解
    一、mysqldump简介mysqldump 是 MySQL 自带的逻辑备份工具。它的备份原理是通过协议连接到 MySQL 数据库,将需要备份的数据查询出来,将查询出的数据转换成对应的insert 语句,当我们需要还原这些数据时,只要执行这些 insert 语句,即可将对应的数据还原。二、mysqldump命令......
  • 2023_10_11_MYSQL_DAY_03_笔记_上
    2023_10_11_MYSQL_DAY_03_笔记_上10章作业题01答案INSERTINTOclass(classid,cname)VALUES(1,'Java1班');INSERTINTOclass(cname,classid)VALUES('Java2班',2);INSERTINTOclassVALUES(3,'Java3班',NULL);10章作业题020304答案INSERTINTOstud......
  • MySQL的最左原则
    一、简述MySQL索引的最左原则指的是,当使用多列索引时,MySQL会优先使用索引中最左边的列。如果查询条件中包含了索引的最左列,那么MySQL会使用这个索引来加速查询。更具体的描述:建立一个索引,对于索引中的字段,mysql会一直向右匹配直到遇到范围查询(>、<、between、like)就停止匹配......
  • MySQL--索引
    MySQL--索引索引概述索引是帮助MySQL高效获取数据的数据结构(有序)演示使用全表扫描性能极低使用二叉搜索树更高效优缺点索引结构B+Tree索引Hash索引R-Tree(空间索引)Full-text(全文索引)存储引擎支持情况平常所说的索引都是指的B+树索引二叉树B-Tree(多路......