首页 > 数据库 >MySQL行锁和表锁的含义及区别

MySQL行锁和表锁的含义及区别

时间:2023-03-18 12:12:26浏览次数:70  
标签:加锁 行锁 InnoDB MyISAM MySQL 表锁

MySQL常用引擎有MyISAM和InnoDB,而InnoDB是mysql默认的引擎。MyISAM不支持行锁,而InnoDB支持行锁和表锁。

如何加锁

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

显式加锁

上共享锁(读锁)的写法:lock in share mode,例如:

select  math from zje where math>60 lock in share mode;

上排它锁(写锁)的写法:for update,例如:

select math from zje where math >60 for update;

表锁

不会出现死锁,发生锁冲突几率高,并发低。

MyISAM引擎

MyISAM在执行查询语句(select)前,会自动给涉及的所有表加读锁,在执行增删改操作前,会自动给涉及的表加写锁。

MySQL的表级锁有两种模式:

  • 表共享读锁
  • 表独占写锁

读锁会阻塞写,写锁会阻塞读和写

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

MyISAM不适合做写为主表的引擎,因为写锁后,其它线程不能做任何操作,大量的更新会使查询很难得到锁,从而造成永远阻塞

行锁

会出现死锁,发生锁冲突几率低,并发高。

在MySQL的InnoDB引擎支持行锁,与Oracle不同,MySQL的行锁是通过索引加载的,也就是说,行锁是加在索引响应的行上的,要是对应的SQL语句没有走索引,则会全表扫描,行锁则无法实现,取而代之的是表锁,此时其它事务无法对当前表进行更新或插入操作。

for update

如果在一条select语句后加上for update,则查询到的数据会被加上一条排它锁,其它事务可以读取,但不能进行更新和插入操作。

行锁的实现需要注意:

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

行锁场景

A用户消费,service层先查询该用户的账户余额,若余额足够,则进行后续的扣款操作;这种情况查询的时候应该对该记录进行加锁。

否则,B用户在A用户查询后消费前先一步将A用户账号上的钱转走,而此时A用户已经进行了用户余额是否足够的判断,则可能会出现余额已经不足但却扣款成功的情况。

为了避免此情况,需要在A用户操作该记录的时候进行for update加锁

间隙锁

当我们用范围条件而不是相等条件检索数据,并请求共享或排他锁时,InnoDB会给符合条件的已有数据记录的索引项加锁;对于键值在条件范围内并不存在的记录,叫做间隙

InnoDB也会对这个"间隙"加锁,这种锁机制就是所谓的间隙锁。

 

参考:

 

标签:加锁,行锁,InnoDB,MyISAM,MySQL,表锁
From: https://www.cnblogs.com/xfeiyun/p/17229679.html

相关文章

  • MySQL中myisam与innodb的区别
    MyISAM不支持事务,但是每次查询都是原子的;支持表级锁,即每次操作对整个表加锁;存储表的总行数;一个MYISAM表有三个文件:索引文件、表结构文件、数据文件;采用非聚集索引,索......
  • Docker Mysql限制内存
    买了个阿里云的1G单核的服务器,运行了Docker装了数据库占用内存2/3的内存,然后再跑个Java小型程序直接死机,无奈只能减小mysql内存解决后效果:查询了网上资料总结解决方案:......
  • Redis:我大哥是mysql
    Redis:我大哥是mysql本文说明:简单梳理redis的设计redis某种角度上只是mysql的手下的工具人1.缓存管理redis的出现:作为缓冲区、以免mysql被大量请求冲烂宕机如果同......
  • 路飞:上线架构图、阿里云购买云服务器ECS、云服务器安装mysql、云服务器安装redis(源码
    目录一、上线架构图二、阿里云购买云服务器ECS2.1试用版云服务器ECS获取流程2.2ssh客户端连接远程服务器2.3finalshell连接远程数据库2.4远程服务器的准备工作三、云服务器......
  • mysql-information_schema 数据库
    1概述information_schema数据库跟performance_schema一样,都是MySQL自带的信息数据库。其中performance_schema用于性能分析,而information_schema用于存储数据库......
  • mysql count()的底层实现和其优化
    mysqlcount(*)的底层实现和其优化在业务中经常使用count(*)来计算行数,当有人问起其实现方式时,不能很好的解答......
  • mysql 查询1个订单 存在3件及以上商品一样的其它订单
    1、需求要查1个订单存在3件及以上商品一样的其它订单2、数据表表:order_sku字段:order_code,skuCREATETABLE`order_sku`(`id`int(10)NOTNULL,`order_c......
  • mysql查询怎么区分大小写
    mysql中查询默认是区分大小写的,但是在mysql中默认不区分大小写。解决办法:mysql可以在SQL语句中加入BINARY来区分大小写。BINARY不是函数,是类型转换运算符,它用来强制它后......
  • mysql-performance_schema
    |目录1、什么是performance_schema2、performance_schema使用快速入门2.1.检查当前数据库版本是否支持2.2.启用performance_schema2.3.performance_schema表的分......
  • 主从复制之--------mysql的半同步复制和异步复制
    一、两台mysql服务器192.168.217.110192.168.217.111二、1、先确认MySQL服务器是否支持动态增加插件mysql>select@@have_dynamic_loading    2、分别在主从......