MySQL锁专题

本文详细解释了MySQL中的隔离级别(ReadUncommitted,ReadCommitted,RepeatableRead,SERIALIZABLE)与不同类型的锁(行级、表级、页级、共享锁和排他锁)的关系,以及InnoDB引擎如何实现行级锁。还讨论了乐观锁和悲观锁的工作原理及其适用场景。
摘要由CSDN通过智能技术生成

1,隔离级别与锁的关系

(1)Read Uncommit 隔离级别下,读取数据不需要加锁,这样就不会跟被修改的数据上的排他锁冲突,但会出现脏读(事务B读到了事务A修改了数据但未提交事务并且回滚了的脏数据)

(2)Read Committed隔离级别下,读操作需要加共享锁,但是在语句执行完以后释放共享锁。避免了脏读,但有可能造成不可重复读(事务B两次读取同一行,在此期间事务A修改了数据,得到结果不同)

(3)Repeatable Read隔离级别下,读操作需要加共享锁,但是在事务提交之前并不释放共享锁,也就是必须等待事务执行完毕以后才释放共享锁。由此避免了不可重复读,无法避免幻读(事务A在事务B先后两次读取时增加了数据,导致事务B后一次读取到前一次查询没有看到的行。)

(4)SERIALIZABLE 是限制性最强的隔离级别,因为该级别锁定整个范围的键,并一直持有锁,直到事务完成。事务只能一条一条的串行化执行,避免了幻读

2,mySQL锁按照粒度来分有几类?

(1)行级锁

InnoDB引擎默认采用的锁,粒度最小。只针对当前操作行加锁。行级锁能大大减少数据库操作的冲突。其加锁粒度最小,但加锁的开销也最大。行级锁分为共享锁和排他锁。

特点:开销大,加锁慢,会出现死锁,锁定粒度最小,发生锁冲突的概率最低,并行化最高

(2)表级锁

MyISAM默认采用的锁,MySQL中锁定粒度最大的一种锁,表示对当前操作的整张表加锁,它实现简单,资源消耗较少,被大部分MySQL引擎支持。最常使用的MyISAM与InnoDB都支持表级锁定。表级锁定分为表共享读锁(共享锁)与表独占写锁(排他锁)。

特点:开销小,加锁块,不会出现死锁,锁定粒度最大,发生锁冲突的概率最高,并行化最低

(3)页级锁

是MySQL中锁定粒度介于行级锁和表级锁中间的一种锁。表级锁速度快,但冲突多,行级冲突少,但速度慢。所以取了折衷的页级,一次锁定相邻的一组记录

3,mySQL锁按照类别来分有几类?

(1)共享锁,也称读锁

当用户要进行数据的读取时,对数据加上共享锁。共享锁之间互相不排斥,共享锁可以同时加上多个。

(2)排他锁,又称写锁

当用户要进行数据的写入时,对数据加上排他锁。排他锁只可以加一个,他和其他的排他锁,共享锁都相斥

4,MySql中INNODB引擎的行级锁怎么实现的?

InnoDB是基于索引来完成行锁

例: select * from tab_with_index where id = 1 for update;  for update 可以根据条件来完成行锁锁定,并且 ID 是有索引键的列,如果 ID不是索引键那么InnoDB将完成表锁,并发将无从谈起

5,MySql中锁算法有哪些?

(1)记录锁:单个记录行上的锁(普通行锁)

(2)间隙锁:锁定一个范围,不包括记录本身(锁定本记录前几行记录或后几行记录)

(3)Next-key lock:锁定一个范围,包含记录本身(最高级别行锁)

Innodb对于行的查询使用next-key lock解决幻读问题,当查询的索引含有唯一属性时,将next-key lock降级为记录锁。

间隙锁设计的目的是为了阻止多个事务将记录插入到同一范围内,而这会导致幻读问题的产生

有两种方式显式关闭gap锁:(除了外键约束和唯一性检查外,其余情况仅使用record lock)

A. 将事务隔离级别设置为RC  B. 将参数innodb_locks_unsafe_for_binlog设置为1

6,数据库的乐观和悲观锁是如何实现的?

悲观锁:假定每个事务之间一定会发生冲突,屏蔽一切可能违反数据完整性的操作。在查询完数据的时候就把事务锁起来,直到提交事务。实现方式:数据库里面的锁机制

乐观锁:假定每个事务之间一定不会发生冲突,只在提交操作时检查是否违反数据完整性。在修改数据的时候把事务锁起来,通过Version的方式来进行锁定。实现方式:版本号或CAS

使用场景:乐观锁常用于写操作比较少(多读)的场景下,即冲突很少发生的情况下,这样省去了锁的开销,加大了系统吞吐量。如果是多写的场景,一般会经常产生冲突,CAS会发生自旋,这就会导致上层应用会不断的进行Retry,这样反倒是降低了性能,所以一般多写的场景下用悲观锁就比较合适。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Nathaniel333

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值