数据库面试知识点总结

数据库锁模块

MyISAM与InnoDB关于锁方面的区别是什么?

  • MyISAM默认用的是表级锁,不支持行级锁(在对数据库进行操作时只会锁住被操作的行)
  • InnoDB默认用的是行级锁,也支持表级锁(在对数据库进行操作时会锁住整张表)
  • MyISAM不支持事务
  • InnoDB支持事务

数据库操作不走索引时使用的是表级锁

MyISAM

在该引擎下会默认添加表锁,当对数据进行select操作时会为表添加一个表级别的读锁;当进行update、insert和delete操作时会自动加上表级别的写锁。

适用场景

  • 频繁执行全表count语句,MyISAM中有一个变量保存了整个表的行数
  • 对数据进行增删改的频率不高(因为增删改会涉及到锁表操作),查询非常频繁
  • 没有事务的场景

InnoDB

在该引擎下会默认使用的是行锁,行级锁与表级锁的共享性和排它性是一样的,只不过作用的范围不同,行级锁只作用于被上锁的行。

适用场景

  • 数据增删改查都相当频繁
  • 可靠性要求比较高,要求支持事务

数据库锁的分类

读锁

读锁又被称为共享锁,因为一个会话对数据库进行读操作不会阻塞其它会话的读操作,但是会阻塞其它会话的写操作。

在进行select操作的后面加上for update将会添加排它锁,加lock in share mode会添加共享锁

写锁

写锁又被称为排它锁,当一个会话给数据库加了写锁后会阻塞其它会话中所有的读和写操作。

显示添加读/写锁

lock tables TABLE_NAME read/write;

unlock tables 删除锁

页级锁

介于表级和行级锁之间,锁定位于被操作数据相邻的数据

意向锁

当事务A锁住了表中的某一行时,事务B如果想要申请整张表的写锁,这是因为事务A对数据行加了行锁,如果让B申请成功那么就会与A发生冲突。因此在给事务B分配表锁时需要判断当前数据库表有没有被其它事务加过行或者表锁,那么就需要进行如下判断:

1:判断表是否已被其他事务用表锁锁表

2:判断表中的是否有任意一行已被行锁锁住。

这样的话在第2步中需要对整张表中记录进行判断,效率比较低。于是就有了意向锁,在意向锁存在的情况下,任何事务对表或者行进行上锁前都必须先获取意向锁,有了意向锁,上面的检查过程就变为:

1:不变

2:获取表的意向锁

申请意向锁的动作是数据库完成的,事务进行上锁时数据库会自动先申请表的意向锁,不需要我们程序员使用代码来申请

悲观锁

当我们要对一个数据库中的一条数据进行修改的时候,为了避免同时被其他人修改,最好的办法就是直接对该数据进行加锁以防止并发。这种借助数据库锁机制,在修改数据之前先锁定,再修改的方式被称之为悲观并发控制。

乐观锁

乐观锁是相对悲观锁而言的,乐观锁假设数据一般情况下不会造成冲突,所以在数据进行提交更新的时候,才会正式对数据的冲突与否进行检测,如果发现冲突了,则返回给用户错误的信息,让用户决定如何去做。

事务的ACID

原子性(Atomicity):指事务是一个不可分割的工作单位,事务中的操作要么都发生,要么都不发生

一致性(Consistency):事务前后数据的完整性必须保持一致,可类比能量守恒定律

隔离性(Isolation):指多个用户并发访问数据库时,数据库为每个用户开启事务,不能被其他事务的操作所干扰,多个并发事务之间要相互隔离

持久性(Durability):指一个事务一旦被提交,他对数据库中数据的改变是永久性的,接下来即使数据库发生故障也不应该对其有影响

事务隔离级别以及各级别下的并发访问问题

查看会话的事务隔离级别select @@tx_isolation

设置会话的隔离级别set session transaction isolation level read uncommitted

事务隔离级别越高,安全性越高,串行化执行越严重,降低数据库的并发度。Oracle默认为READ-COMMITTED, MySQL默认为REPEATABLE-READ

事务并发访问引起的问题以及如何避免

1. 更新丢失—MySQL所有事务隔离级别再数据库层面上均可避免

一个事务的更新覆盖了另一个事务的更新,目前主流数据库都会主动加锁来避免更新丢失的情况。

2. 脏读—READ-COMMITTED事务隔离级别以上可避免

一个事务读取另一个事务未提交的更新数据

3. 不可重复读—REPEATABLE-READ事务隔离级别以上可避免

多次读取操作返回的结果不一致现象

4. 幻读—SERIALIZALE事务隔离级别可避免

事务A读取与搜索条件相匹配的若干行,事务B通过删除或插入改变了事务A的结果集

InnoDB可重复读隔离级别下如何避免幻读

表象:快照读(非阻塞读)—伪MVCC

当前读

加了锁的增删改查语句:select ... lock in share mode,select ... for update,update,delete,insert

快照读(隔离级别在SERIALIZALE一下才能成立)

不加锁的非阻塞读,select,提升并发执行的能力,开销低,读取数据可能不是最新版本

内在:next-key锁(行锁+gap锁)

对主键索引或者唯一索引会用Gap锁吗

  • 如果where条件全部命中,则不会用Gap锁,只会加记录锁
  • 如果where条件部分命中或者全不命中,则会加Gap锁

原文地址:https://www.cnblogs.com/sasworld/p/11517707.html

时间: 2024-10-13 07:39:11

数据库面试知识点总结的相关文章

【数据库】数据库面试知识点汇总

转自:https://www.cnblogs.com/wenxiaofei/p/9853682.html 数据库面试知识点汇总 一.基本概念 1.主键.外键.超键.候选键 超键:在关系中能唯一标识元组的属性集称为关系模式的超键.一个属性可以为作为一个超键,多个属性组合在一起也可以作为一个超键.超键包含候选键和主键. 候选键:是最小超键,即没有冗余元素的超键. 主键:数据库表中对储存数据对象予以唯一和完整标识的数据列或属性的组合.一个数据列只能有一个主键,且主键的取值不能缺失,即不能为空值(Nul

数据库面试知识点汇总

主键:数据库表中唯一标识:一个数据列只能有一个主键,且主键的取值不能缺失,即不能为空值(Null). 外键:在一个表中存在的另一个表的主键称此表的外键. 触发器的作用? 触发器是一种特殊的存储过程,主要是通过事件来触发而被执行的.它可以强化约束,来维护数据的完整性和一致性,可以跟踪数据库内的操作从而不允许未经许可的更新和变化.可以联级运算.如,某表上的触发器上包含对另一个表的数据操作,而该操作又会导致该表触发器被触发. 什么是存储过程?用什么来调用? 存储过程是一个预编译的SQL语句,优点是允许

Android面试知识点(转)

该文所有问题转自:http://www.cnblogs.com/hpboy/p/3307371.html 一.算法,数据结构 1.排序算法 2.查找算法 3.二叉树 4.广度,深度算法: 二.java基础 1.集合Collection,List,Map等常用方法,特点,关系: 2.线程的同步,中断方式有几种,线程池,线程状态,常用的方法比较,比如wait,sleep等: 3.反射机制 4.IO包的使用,运用了什么设计模式 5.设计模式,常用的设计模式,运用场景: 6.内存管理,引用的种类: 7.

怎么掌握安卓中高级开发面试知识点?缓存重点都在这!

前言 之前早就说要整理一个集合方便大家,还好没有拖到2020年BATJ.字节跳动面试专题,算法专题,高端技术专题,混合开发专题,java面试专题,Android,Java小知识,到性能优化.线程.View.OpenCV.NDK等已经上传到了的我的GitHub 大家点击我的GitHub地址:https://github.com/Meng997998/AndroidJX点下star一起学习 好了今天就跟着我来,告诉你缓存重点,一起熟练掌握安卓中高级开发面试知识点! 我们都知道,几乎所有的项目都做了缓

面试--知识点2

1.1 JAVA基础 面向对象和面向过程的区别 Java 语言有哪些特点 关于 JVM JDK 和 JRE 最详细通俗的解答 Oracle JDK 和 OpenJDK 的对比 List 和 Set 的区别 什么是 Java 程序的主类 应用程序和小程序的主类有何不同 Java 应用程序与小程序之间有那些差别 字符型常量和字符串常量的区别 Java 面向对象编程三大特性: 封装 继承 多态 构造器 Constructor 是否可被 override Arrays.sort 实现原理和 Collec

L--前端开发面试知识点(HTML相关)

简介 前端开发面试知识点大纲: HTML&CSS: 对web标准的理解.浏览器内核的差异.兼容性.hack.css基本功:布局.盒子模型.选择器优先级及使用.HTML5.CSS3.移动端适应. javascript: 数据类型.面向对象.继承.闭包.插件.作用域.跨域.原型链.模块化.自定义事件.内存泄露.事件机制.异步装载回调.模板引擎.nodejs.JSON.ajax 其他:HTTP.安全.正则.优化.重构.响应式.移动端.团队协作.可维护.SEO.UED.架构.职业生涯 1.请你谈谈Coo

数据库面试系列大纲

数据库面试经常被问到的考点: 1.内连接和外连接,左外连接和右外连接,全外连接 2.视图是什么,视图的优点 3.索引的优点,建立索引的规则有哪些? 4.写sql语句:涉及到order by ,group by, having ,like ,limit  等 5.什么是慢查询?如何优化慢查询? 6.mysql性能优化 7.mysql的存储引擎都有哪些?这些存储引擎有什么区别? 后面会针对每个点写单独的博客...

Java---常用基础面试知识点

综合网上的一点资源,给大家整理了一些Java常用的基础面试知识点,希望能帮助到刚开始学习或正在学习的学员. 1.抽象 抽象就是忽略一个主题中与当前目标无关的那些方面,以便更充分地注意与当前目标有关的方面.抽象并不打算了解全部问题,而只是选择其中的一部分,暂时不用部分细节.抽象包括两个方面,一是过程抽象,二是数据抽象. 2.继承 继承是一种联结类的层次模型,并且允许和鼓励类的重用,它提供了一种明确表述共性的方法. 对象的一个新类可以从现有的类中派生,这个过程称为类继承.新类继 承了原始类的特性,新

Java 面试知识点解析(二)——高并发编程篇

前言: 在遨游了一番 Java Web 的世界之后,发现了自己的一些缺失,所以就着一篇深度好文:知名互联网公司校招 Java 开发岗面试知识点解析 ,来好好的对 Java 知识点进行复习和学习一番,大部分内容参照自这一篇文章,有一些自己补充的,也算是重新学习一下 Java 吧. 前序文章链接: Java 面试知识点解析(一)--基础知识篇 (一)高并发编程基础知识 这里涉及到一些基础的概念,我重新捧起了一下<实战 Java 高并发程序设计>这一本书,感觉到心潮澎湃,这或许就是笔者叙述功底扎实的