241期说说你知道的MySQL中的各种锁

2021-07-02 08:18 Java最全面试题库

图片

今天去看牙医,他问我年级轻轻牙齿怎么磨损这么严重?我说,没有点赞的这些年,我都是咬着牙过来的。

共享锁(S锁): 又称为读锁,可以查看但无法修改和删除的一种数据锁。如果事务T对数据A加上共享锁后,则其他事务只能对A再加共享锁,不能加排它锁。获准共享锁的事务只能读数据,不能修改数据。 共享锁下其它用户可以并发读取,查询数据。但不能修改,增加,删除数据。资源共享.

排它锁(X锁): 又称为写锁、独占锁,若事务T对数据对象A加上X锁,则只允许T读取和修改A,其他任何事务都不能再对A加任何类型的锁,直到T释放A上的锁。这就保证了其他事务在T释放A上的锁之前不能再读取和修改A

互斥锁: 在编程中,引入了对象互斥锁的概念,来保证共享数据操作的完整性。每个对象都对应于一个可称为" 互斥锁" 的标记,这个标记用来保证在任一时刻,只能有一个线程访问该对象。

悲观锁、乐观锁:

悲观锁: 总是假设最坏的情况,每次去拿数据的时候都认为别人会修改,所以每次在拿数据的时候都会上锁,这样别人想拿这个数据就会阻塞直到它拿到锁。传统的关系型数据库里边就用到了很多这种锁机制,比如行锁,表锁等,读锁,写锁等,都是在做操作之前先上锁。再比如Java里面的同步原语synchronized关键字的实现也是悲观锁。

乐观锁: 顾名思义,就是很乐观,每次去拿数据的时候都认为别人不会修改,所以不会上锁,但是在更新的时候会判断一下在此期间别人有没有去更新这个数据,可以使用版本号等机制。乐观锁适用于多读的应用类型,这样可以提高吞吐量,像数据库提供的类似于write_condition机制,其实都是提供的乐观锁。在Java中java.util.concurrent.atomic包下面的原子变量类就是使用了乐观锁的一种实现方式CAS实现的。

参考:www.cnblogs.com/qjjazry/p/6581568.html

行级锁: 行级锁是 MySQL 中锁定粒度最细的一种锁,表示只针对当前操作的行进行加锁。行级锁能大大减少数据库操作的冲突,其加锁粒度最小,但加锁的开销也最大。行级锁分为共享锁和排他锁。开销大,加锁慢;会出现死锁;锁定粒度最小,发生锁冲突的概率最低,并发度也最高。

表级锁: 表级锁是 MySQL 中锁定粒度最大的一种锁,表示对当前操作的整张表加锁,它实现简单,资源消耗较少,被大部分 MySQL 引擎支持。最常使用的 MyISAM 与 InnoDB 都支持表级锁定。表级锁定分为表共享读锁(共享锁)与表独占写锁(排他锁)。开销小,加锁快;不会出现死锁;锁定粒度大,发出锁冲突的概率最高,并发度最低。

页级锁: 页级锁是 MySQL 中锁定粒度介于行级锁和表级锁中间的一种锁。表级锁速度快,但冲突多,行级冲突少,但速度慢。因此,采取了折衷的页级锁,一次锁定相邻的一组记录。BDB 支持页级锁。开销和加锁时间界于表锁和行锁之间;会出现死锁;锁定粒度界于表锁和行锁之间,并发度一般。

丢失修改: 指事务1和事务2同时读入相同的数据并进行修改,事务2提交的结果破坏了事务1提交的结果,导致事务1进行的修改丢失。

不可重复读: 一个事务在读取某些数据后的某个时间,再次读取以前读过的数据,却发现其读出的数据已经发生了改变、或某些记录已经被删除了!

读脏数据: 事务T1修改某一数据,并将其写回磁盘,事务T2读取同一数据后,T1由于某种原因被撤消,这时T1已修改过的数据恢复原值,T2读到的数据就与数据库中的数据不一致,则T2读到的数据就为"脏"数据,即不正确的数据。

死锁: 两个或两个以上的进程在执行过程中,由于竞争资源或者由于彼此通信而造成的一种阻塞的现象,若无外力作用,它们都将无法推进下去。此时称系统处于死锁状态或系统产生了死锁,这些永远在互相等待的进程称为死锁进程

死锁四个产生条件:

1)互斥条件: 指进程对所分配到的资源进行排它性使用,即在一段时间内某资源只由一个进程占用。如果此时还有其它进程请求资源,则请求者只能等待,直至占有资源的进程用毕释放。

2)请求和保持条件: 指进程已经保持至少一个资源,但又提出了新的资源请求,而该资源已被其它进程占有,此时请求进程阻塞,但又对自己已获得的其它资源保持不放。

3)不剥夺条件: 指进程已获得的资源,在未使用完之前,不能被剥夺,只能在使用完时由自己释放。

4)环路等待条件: 指在发生死锁时,必然存在一个进程——资源的环形链,即进程集合{P0,P1,P2,···,Pn}中的P0正在等待一个P1占用的资源;P1正在等待P2占用的资源,……,Pn正在等待已被P0占用的资源。

预防死锁打破上述之一的条件。

来源:blog.csdn.net/weixin_36634753/article/details/90815755

往期回顾:

图片

2020年百日百更原创Java最全面试题库之往期回顾

【000期】Java最全面试题库思维导图

【020期】JavaSE系列面试题汇总(共18篇)

【028期】JavaWeb系列面试题汇总(共10篇)

【042期】JavaEE系列面试题汇总(共13篇)

【049期】数据库系列面试题汇总(共6篇)

【053期】中间件系列面试题汇总(共3篇)

【065期】数据结构与算法面试题汇总(共11篇)

【076期】分布式面试题汇总(共10篇)

【100期】综合面试题系列汇总(共23篇)

【151期】100-150期汇总(共50篇)

【201期】150-200期汇总(共50篇)

【202期】如何用 Redis 统计独立用户访问量?

【203期】Mybatis是如何运用设计模式的?

【204期】LRU的原理是什么?Redis是如何实现LRU的?

【205期】Feign的工作原理是什么?

【206期】数据库可以部署在容器中吗?为什么?

【207期】为什么SELECT * 效率低?

【208期】如何解决Redis主从集群切换数据丢失问题?

【209期】Java8中Stream对列表去重的方法有哪些?

【210期】Spring的Bean实例化过程是怎样的?

【211期】Tomcat 在 SpringBoot 中是如何启动的?

【212期】 Spring 注解式 AOP 的底层实现原理是什么?

【213期】如何保证缓存和数据库的一致性?

【214期】@Annotation注解的实现原理是什么?

【215期】说说你对 RabbitMQ 的理解以及使用它的场景

【216期】分布式 ID 解决方案有哪些?

【217期】你对MySQL中的索引了解多少?

【218期】SpringBoot中的@Import注解的原理是什么?

【219期】哈希表的原理是什么?

【220期】如何使用Redis实现电商系统的库存扣减?

【221期】一段Java代码是如何执行的?

【222期】为什么Integer用==比较时127相等而128不相等?

【223期】Java遍历Map集合有哪几种方式?各自效率如何?

【224期】try-catch-finally 和 return 的执行顺序是怎样的?

【225期】在不停止程序运行的情况下,如何实现对象(或者类)的动态替换?

【226期】1.3 万亿条数据查询,如何做到毫秒级响应?

【227期】Nacos的实现原理是什么?

【228期】说一下JDK/Dubbo/Spring 三种 SPI 机制?

【229期】ArrayList使用forEach遍历的时候删除元素会报错吗?

【230】熟悉红黑树吗?能不能手写一下?

【231期】JDK 序列化, 碰到serialVersionUID 不一致问题,怎么处理?

【232期】a==1 && a==2 && a==3 是 true 还是 false?

【233期】谈谈 Tomcat 架构及启动过程

【234期】说说Log4j2中RollingFile的文件滚动更新机制

【235期】在设计原则中,为什么反复强调组合要优于继承?

【236期】写时复制(Copy-On-Write)在Java中是如何被应用的?

【237期】说说Java的日志体系及各个组件之间的关系

【238期】线程池是如何重复利用空闲线程的?

【239期】说说Netty 实现长连接服务的难点和优化点

【240期】说说Redis的读写分离技术






“一个专注于分享各类Java面试题的号主,长按二维码关注我吧 ”

祝大家都能拿到心仪的offer!





图片


图片
图片

图片长按识别二维码

等风也等你



文章都看完了图片不点个图片 吗

本文章转载自公众号:tikujie

首页 - Java 相关的更多文章: