• 一  . 事务的四个特性?

四大特性是:ACID 原子性(Atomicity)、一致性(Consistency)、隔离性(Isolation)、持久性(Durability)+介绍四个特性概念;

原子性:整个事务中的所有操作,要么全部完成,要么全部不完成,不可能停滞在中间某个环节。事务在执行过程中发生错误,会被回滚(Rollback)到事务开始前的状态,就像这个事务从来没有执行过一样。

一致性:在事务开始之前和事务结束以后,数据库的完整性约束没有被破坏。

隔离性:当两个或者多个事务并发访问(此处访问指查询和修改的操作)数据库的同一数据时所表现出的互相关系。事务隔离分为不同的级别,包括读未提交(Read uncommitted)、读提交(Read committed)、可重复读(Repeatable read)和串行化(Serializable)。隔离状态执行事务,使它们好像是系统在给定时间内执行的唯一操作。如果有两个事务,运行在相同的时间内,执行 相同的功能,事务的隔离性将确保每一事务在系统中认为只有该事务在使用系统。这种属性有时称为串行化,为了防止事务操作间的混淆,必须串行化或序列化请求,使得在同一时间仅有一个请求用于同一数据。

持久性:在事务完成以后,该事务对数据库所作的更改便持久的保存在数据库之中,并不会被回滚。

二 .  事务的隔离级别

读未提交(Read uncommitted)、读已提交(Read committed)、可重复读(Repeatable read)和串行化(Serializable)

  ① Serializable (串行化):可避免脏读、不可重复读、幻读的发生。

  SERIALIZABLE可以防止除更新丢失外所有的一致性问题,即:

    1.语句无法读取其它事务已修改但未提交的记录。

    2.在当前事务完成之前,其它事务不能修改目前事务已读取的记录。

    3.在当前事务完成之前,其它事务所插入的新记录,其索引键值不能在当前事务的任何语句所读取的索引键范围中。

  ② Repeatable read (可重复读):可避免脏读、不可重复读的发生。

  REPEATABLE READ事务不会产生脏读,并且在事务完成之前,任何其它事务都不能修改目前事务已读取的记录(这一点和串行化一样)。其它事务仍可以插入新记录,但必须符合当前事务的搜索条件——这意味着当前事务重新查询记录时,会产生幻读(Phantom Read)。

  ③ Read committed (读已提交):可避免脏读的发生。

    语句无法读取其它事务已修改但未提交的记录。(这一点 和串行化一样)

  ④ Read uncommitted (读未提交):最低级别,任何情况都无法保证。

三. 四大冲突问题(脏不更换)

1、脏读(读错)

某个事务读取的数据是另一个事务正在处理的数据。而另一个事务可能会回滚,造成第一个事务读取的数据是错误的。

2、不可重复读(读旧)

在一个事务里两次读入数据,但另一个事务已经更改了第一个事务涉及到的数据,造成第一个事务读入旧数据。

3、幻读

幻读是指当事务不是独立执行时发生的一种现象。例如第一个事务对一个表中的数据进行了修改,这种修改涉及到表中的全部数据行。同时,第二个事务也修改这个表中的数据,这种修改是向表中插入一行新数据。那么,以后就会发生操作第一个事务的用户发现表中还存在没有被修改的数据行,就好象发生了幻觉一样。

4、更新丢失

多个事务同时读取某一数据,一个事务成功处理好了数据,被另一个事务写回原值,造成第一个事务更新丢失。

四。 乐观锁和悲观锁?使用场景?

乐观锁:默认读数据的时候不会修改,所以不会上锁;

悲观锁:默认读数据的时候会修改,所以会上锁;

乐观锁适用于多读少写的情况,省去锁的开销,加大系统的吞吐量。

五。 MySQL引擎的区别?

mysql两种存储引擎:InnoDB和MyISAM
区别:(1.事务;2.锁;3.效率;4.查询/插入更新)

1).MyISAM是非事务安全型的,而InnoDB是事务安全型的。

2).MyISAM锁的粒度是表级,而InnoDB支持行级锁定。

3).MyISAM相对简单,所以在效率上要优于InnoDB,小型应用可以考虑使用MyISAM。

4).MyISAM管理非事务表。它提供高速存储和检索,以及全文搜索能力。如果应用中需要执行大量的SELECT查询,那么MyISAM是更好的选择。

5).InnoDB用于事务处理应用程序,具有众多特性,包括ACID事务支持。如果应用中需要执行大量的INSERT或UPDATE操作,则应该使用InnoDB,这样可以提高多用户并发操作的性能。由于锁的粒度更小,写操作不会锁定全表,所以在并发较高时,使用Innodb引擎会提升效率。

六。 数据库索引有哪些类型?

普通索引、唯一索引、主键索引、组合索引;

普通索引:没有任何限制;

唯一索引:索引列的值必须唯一,但允许有空值;

主键索引:特殊的唯一索引,不允许有空值;一个表只能有一个主键;

组合索引:多个字段组合作为索引;

在聚集索引中,表中行的物理顺序与键值的逻辑(索引)顺序相同。一个表只能包含一个聚集索引。

补充聚集索引和非聚集索引的区别:

     聚集索引和非聚集索引的根本区别是表记录的排列顺序和与索引的排列顺序是否一致,聚集索引表记录的排列顺序与索引的排列顺序一致,优点是查询速度快,因为一旦具有第一个索引值的纪录被找到,具有连续索引值的记录也一定紧跟其后。聚集索引的缺点是对表进行修改速度较慢,这是为了保持表中的记录的物理顺序与索引的顺序一致,而把记录插入到数据页的相应位置,必须在数据页中进行数据重排,降低了执行速度。建议使用聚集索引的场合为:  a.此列包含有限数目的不同值;  b.查询的结果返回一个区间的值;  c.查询的结果返回某值相同的大量结果集。

七。 数据库索引原理?具体参考博文:https://blog.csdn.net/weixin_37766296/article/details/80461963

索引:数据库索引,是数据库管理系统中一个排序的数据结构,以协助快速查询、更新数据库表中数据。索引的实现通常使用B树及其变种B+树。

在数据之外,数据库系统还维护着满足特定查找算法的数据结构,这些数据结构以某种方式引用(指向)数据,这样就可以在这些数据结构上实现高级查找算法。这种数据结构,就是索引。

八。B树和B+树原理?

为什么使用B树?
      二叉查找树结构由于树的深度过大而造成磁盘I/O读写过于频繁,进而导致查询效率低下。采用多叉树结构减少树的深度,从而达到有效避免磁盘过于频繁的查找存取操作,从而有效提高查找效率。

动态查找树主要有:二叉查找树(Binary Search Tree),平衡二叉查找树(Balanced Binary Search Tree),红黑树(Red-Black Tree ),B-tree/B+-tree/ B*-tree (B~Tree)。前三者是典型的二叉查找树结构,其查找的时间复杂度O(log2N)与树的深度相关,那么降低树的深度自然会提高查找效率。

但是咱们有面对这样一个实际问题:就是大规模数据存储中,实现索引查询这样一个实际背景下,树节点存储的元素数量是有限的(如果元素数量非常多的话,查找就退化成节点内部的线性查找了),这样导致二叉查找树结构由于树的深度过大而造成磁盘I/O读写过于频繁,进而导致查询效率低下(为什么会出现这种情况,待会在外部存储器-磁盘中有所解释),那么如何减少树的深度(当然是不能减少查询的数据量),一个基本的想法就是:采用多叉树结构(由于树节点元素数量是有限的,自然该节点的子树数量也就是有限的)。(解释为什么使用B树)

也就是说,因为磁盘的操作费时费资源,如果过于频繁的多次查找势必效率低下。那么如何提高效率,即如何避免磁盘过于频繁的多次查找呢?根据磁盘查找存取的次数往往由树的高度所决定,所以,只要我们通过某种较好的树结构减少树的结构尽量减少树的高度,那么是不是便能有效减少磁盘查找存取的次数呢?那这种有效的树结构是一种怎样的树呢?

这样我们就提出了一个新的查找树结构——多路查找树。根据平衡二叉树的启发,自然就想到平衡多路查找树结构,也就是这篇文章所要阐述的第一个主题B~tree,即B树结构(后面,我们将看到,B树的各种操作能使B树保持较低的高度,从而达到有效避免磁盘过于频繁的查找存取操作,从而有效提高查找效率)。

九。什么是B+树?(??)

B+树是B树的变体,也是多路搜索树;B+树的特点是:

  1)非叶子结点的子树指针P[i],指向关键字值属于[K[i], K[i+1])的子树(B-树是开区间)

2)所有关键字都在叶子结点出现;

  3)所有的非叶子节点相当于是叶子节点的索引;

  4)为所有叶子结点增加一个链指针;

B+的搜索与B树也基本相同,区别是B+树只有达到叶子结点才命中(B-树可以在非叶子结点命中),其性能也等价于在关键字全集做一次二分查找;

B+树和B+树的区别:

1.所有关键字都出现在叶子结点的链表中(稠密索引),且链表中的关键字恰好是有序的;

2.只会在叶子结点命中;

3.非叶子结点相当于是叶子结点的索引(稀疏索引),叶子结点相当于是存储(关键字)数据的数据层;

B+树相比B树的优点:

(1) B+树改进了B树, 让内结点只作索引使用, 去掉了其中指向data的指针, 使得每个结点中能够存放更多的key, 这样访问叶节点的数据的磁盘读写次数就更低;

(2) 由于底部的叶子结点是链表形式, 因此也可以实现更方便的顺序遍历, 而B树则需要对整个树的每一层遍历,需要更多的磁盘读写;

十。 为什么用数据库连接池?

1)资源重用。连接池里的连接可以重复使用,避免了频繁创建、释放连接引起的大量性能开销。
2)更快的系统响应速度 。数据库连接池在初始化过程中,往往已经创建了若干数据库连接置于池中备用。此时连接的初始化工作均已完成。对于业务请求处理而言,直接利用现有可用连接,避免了数据库连接初始化和释放过程的时间开销,从而缩减了系统整体响应时间。
  • 数据库连接池配置/驱动参数?如何防止失效?

数据库连接池?
c3p0, druid;DBCP;
DBCP配置参数:
driverClassName:连接数据库所用的 JDBC Driver Class, 
password: 登陆数据库所用的密码 
url: 连接数据库的 URL 
username: 登陆数据库所用的帐号 
初始化连接数量initialSize:连接池启动时创建的初始化连接数量;
最大连接数maxActive:如果超过maxActive,后面的连接请求加入到等待队列中;
最大空闲连接数maxIdle:连接池中允许保持空闲状态的最大连接数量,超过的空闲连接将被释放;
最小空闲连接数minIdle:连接池允许空闲的最小连接数量,小于则创建新的连接;
最大等待时间maxWait;当没有可用连接时,连接池等待连接被归还的最大时间,超过时间则抛出异常。

十一。

数据库连接池如何防止失效?
(设置参数,操作对象/空闲的时候进行验证)
testOnBorrow:取得对象时是否进行验证,检查对象是否有效,默认为false 
testOnReturn:返回对象时是否进行验证,检查对象是否有效,默认为false 
testWhileIdle:空闲时是否进行验证,检查对象是否有效,默认为false 
testOnReturn,testOnBorrow这两个参数为true时,表示会在每次请求之前和之后进行连接池测试,如果连接失效,就会将这条连接对象销毁,创建一个新的连接对象。

testWhileIdle参数。这个参数为true时候,表示空闲时是进行验证,检查对象是否有效。然后minEvictableIdleTimeMillis配合timeBetweenEvictionRunsMillis,每过timeBetweenEvictionRunsMillis秒对连接池进行一次检测,将对象闲置时间超过minEvictableIdleTimeMillis秒的对象进行销毁,创建新的对象来取代。这样就能保证时刻都有正常的连接池对象存在。

转载参考:https://www.cnblogs.com/buwenyuwu/p/7222626.html?utm_source=itdadao&utm_medium=referral

数据库的哪些事儿~~相关推荐

  1. 数据库时区那些事儿 - MySQL的时区处理

    原文地址 当JVM时区和数据库时区不一致的时候,会发生什么?这个问题也许你从来没有注意过,但是当把Java程序容器化的时候,问题就浮现出来了,因为目前几乎所有的Docker Image的时区都是UTC ...

  2. SCPPO(二十三):SQLServer数据库备份那些事儿

    [前言] 今天远程服务器,突然发现服务器一个盘(容量:1T)快满了,于是好奇点进去看看哪些东西占了这么多,经过排查后发现是SQLServer的备份文件,占据了绝大部分的空间:之前对SQLServer的 ...

  3. 14. Python 与数据库那点事儿,滚雪球学 Python

    今天是持续写作的第 14 / 100 天. 如果你有想要交流的想法.技术,欢迎在评论区留言. 本篇文章将给大家介绍 Python 如何操作 SQLite 数据库,本文将是滚雪球学 Python 第一阶 ...

  4. Gdevops广州站:大咖齐聚,从事运维和数据库的你不能错过!

    2019 Gdevops全球敏捷运维峰会广州站:由上海市经信委指导.dbaplus社群主办的年度收官之站,汲全年之精华,取热点技术之核心,重点围绕智慧运维.DevOps.数据库领域,邀请来阿里.腾讯. ...

  5. 巨杉数据库TechDay回顾 | 分布式数据库@民生、Sharding Sphere@京东、ClickHouse@微博

    大数据时代,数据早已成为全球战略资源级的存在,数据库也成为了所有应用成功运行的核心.同时,随着创新业务的不断增加,业务的复杂及庞大的体量必然会产生错综复杂且规模巨大的结构化数据,这些都迫使企业对数据库 ...

  6. SpringBoot + MyBatis + MySQL 读写分离实战

    点击上方"方志朋",选择"设为星标" 回复"666"获取新整理的面试资料 来源:http://t.cn/AiKuJEB9 1. 引言 读写分 ...

  7. windows 2003 下oracle从10.2.0.1升级到10.2.0.4

    方法一: 1. 完全安装10.2.0.1 2. 安装完成后,停止所有的oracle服务,可以通过停止oracle 的window services或者使用以下命令来实现. emctl stop dbc ...

  8. mysql读写分离实例_SpringBoot+MyBatis+MySQL读写分离(实例)

    https://mp.weixin.qq.com/s/1vTbllmZkHRnuk7_xR2DIg 1. 引言 读写分离要做的事情就是对于一条SQL该选择哪个数据库去执行,至于谁来做选择数据库这件事儿 ...

  9. mysql 编码分层_【平台开发】— 5.后端:代码分层

    数据库准备完事儿,现在可以撸后端代码了. 现在想要探索前后端如何交互,得后端返回出数据才行,既然如此,那就先来撸一个返回用户信息,然后就可以判断前端传来的用户名和密码是不是存在,存在的话就可以登录(P ...

最新文章

  1. 当你输入一个网址的时候,实际会发生什么?,互联网营销
  2. PHP结合Ueditor并修改图片上传路径
  3. 使用socket创建服务器进程和客户端进程
  4. 5.7 随机采样最小二乘法
  5. Java中static的作用详解_详解java中static关键词的作用
  6. 算法:Unix是如何简化路径的Simplify Path简化路径规则
  7. [Android]SurfaceView绘制奔跑的小人
  8. docker在centos7中run时遇到的坑?
  9. 2014驾考科目二倒车入库技巧
  10. python魔法方法指南_2011年最热门的20种方法指南
  11. stm32wb55 flash
  12. 在配置kile5 的时候出现core.o的错误如何解决
  13. 【PHP】创蓝253云通信平台国际短信接口调用demo案例
  14. AD19设置元件属性
  15. jstack命令详解
  16. 中国制霸生成器火了/ 马斯克香水被炒至原价10倍/ 闽南话翻英语算法来了… 今日更多新鲜事在此...
  17. 英语各句子成分的主要作用
  18. 亚马逊后台操作不容措施旺季~~~~~~
  19. 在互联网中,资源免费共享还能走多久!
  20. git detached

热门文章

  1. Spring 事务失效的 8 种场景!
  2. 工作总结:日志打印的15个建议
  3. Redis使用不当导致应用卡死
  4. ssh框架常见错误与解决方法
  5. pictureBox1.Image的获得图片路径的三种方法
  6. 一起玩Docker之1——Ubuntu配置安装Docker运行环境并安装(Ubuntu、Centos)镜像
  7. 类模板的分离式编译错误解决
  8. java溢出怎么处理_java数据溢出怎么处理?
  9. java 保存 设置_java – 保存设置的实现
  10. $ajax不能识别,JQuery/JS Ajax功能无法识别