作者:困了电视剧
专栏:《MySQL数据库》
文章分布:这是一篇关于Java中异常类的文章,在本篇文章中详细讲解了异常的使用逻辑和底层的执行过程,如有疏漏,欢迎大佬指正!
目录
索引
用法
底层逻辑
事务
并发执行事务可能产生的问题
脏读问题
不可重复读
幻读
索引
1.数据库中的表、数据、索引之间的关系,类似于书架上的图书、书籍内容和书籍目录的关 系。2.索引所起的作用类似书籍目录,可用于快速定位、检索数据。3.索引对于提高数据库的性能有很大的帮助。
用法
底层逻辑
当创建一个MySQL的索引,就是构建一个B+树,这个树中的元素就是数据库中存储的内容。
我们在了解B+树之前先了解什么是B树,B树又称B-树,是一个n叉搜素树,如图所示
此时我们发现如果数据库中的数据按这种方式进行排列的话,数据参差不齐很难找到我们需要的数据,此时就需要我们的B+树来进行安排了。
除了叶子节点,其他节点保留的仅仅是一个键值也就是用primary定义的key,然后最后一排的叶子节点中存储的才是每一个完整的数据,就比如如果是学生,那叶子节点以外的存储的是id编号,而叶子结点存储的则是每一个学生的姓名,班级等等。
B+数会使所有的数据都出现在叶子节点上,并且叶子节点都在同一个高度,这就使查找的时候效率大大增高。
事务
在生活中我们会遇到这样的问题,当我们再给别人转账的时候,如果我们转出500,在对方账户上进行转入500时发生了错误,那怎么办?我们的500块钱就会这样打水漂了嘛?
不会,为了解决这一问题,MySQL引入了事务这一概念。
事务的本质是将多个sql语句给打包成一个整体,要么全部执行成功,要么就一个都不执行,而不会出现执行一半这种中间状态。这体现了事务最核心的特性——原子性。
注:这里的一个都不执行是,并不是完全不执行,而是如果在执行一半时突然出错了,就停止执行,并将已经执行的部分给进行还原,所以看起来就好像没有执行过一样,这种方式叫做“回滚”。
事务的特性:
1.原子性——最核心的特性。
2.一致性,数据执行前后数据一定要是靠谱的,就比如转500,一个用户少了500,另一个用 户却多了5000,这就是不靠谱的数据。
3.持久性,事务修改的内容是写到硬盘上的,持久存在的,重启也不丢失。
4.隔离性,这个“隔离性”是为了解决“并发”执行事务,引起的问题。
并发执行事务可能产生的问题
脏读问题
在事务A对数据库中的数据进行修改的时候,如果此时事务B进来读了数据,那此时这个事务B读的数据就是脏数据,因为这个数据不是准确的,不确定事务A会不会在进行修改。
为了解决这一个问题,MySQL引入了“写操作加锁”这样的机制,即当事务A在对数据进行修改的时候,事务B不能进行读操作。
不可重复读
当事务A修改好后,此时事务B进行读操作,但当事务B进行读的过程中,事务A又来进行修改了,那事务B读的数据又不准确了。
于是MySQL引入了“读操作加锁”这个机制,是数据的准确性大大增加,提高了事务的隔离性,但同时事务的并发处理能力也下降了。
幻读
在引入读写加锁后,还可能会出现这样的问题,就是虽然我这一个文件在我读的时候不会发生改变了,但是我可能还有其他很多文件,这些个文件并没有上锁,所以当我一次性读完时,我发现我刚才读的那个没有改变但其他的却发生了变化,这在一些情况下是不允许的。
所以此时,MySQL使用“串行化”这样的方式来解决幻读,彻底放弃并发处理事务。
以上就是本篇博客的全部内容了,如有疏漏欢迎补充指正。