做了3年开发,我们来聊聊MySQL数据库隔离级别

点击上方蓝色字体,选择“标星公众号”

优质文章,第一时间送达

本文来源:http://8rr.co/6DbP


1 事务

事务只是一个改变,是一些的操作集合;用专业的术语去解释,就是一个程序的执行单元;事务本身并不包含这四个特性,我们需要通过某些手段,尽可能让这个执行单元满足这四个特性,那么,我们就可以称它是一个事务,或者说是一个正确的,完美的事务。

2 四特性

  • 原子性:满足原子操作单元,对数据的操作,要么全部执行,要么全部不执行。
  • 一致性:事务开始和完成时,数据都必须保持一致。
  • 隔离性:事务之间相互独立,中间状态对外部不可见。
  • 持久性:数据的修改是永久性的,即使系统出现任何故障都能够保持。

3 隔离级别

3.1 并发情况下事务引发的问题

一般情况下,多个单元操作(事务,这里的事务,并不是完美的事务)并发执行,会出现这么几个问题:

  • 脏读:A事务还未提交,B事务就读到了A操作的结果。(破坏了隔离性)
  • 不可重复读:A事务在本次事务中,对自己未操作过数据,进行多次读取,结果出现不一致或记录不存在的情况。(破坏了一致性,重点是update和delete)
  • 幻读:A事务在本次事务中,先读取了一遍数据,发现数据不存在,过了一会,又读取了一遍,发现又有数据了。(破坏了一致性,重点是insert)

3.2 解决(制定标准)

为了权衡『隔离』和『并发』的矛盾,ISO定义了4个事务隔离级别,每个级别隔离程度不同,允许出现的副作用也不同。

  • 未提交读(read-uncommitted):最低级别,基本只保证持久性;会出现脏读,不可重复读,幻读的问题。
  • 已提交读(read-committed):语句级别;会出现不可重复读,幻读的问题。
  • 可重复读(repeatable-read):事务级别;只会出现幻读问题。
  • 串行化(serializable):最高级别,也就是事务与事务完全串行化执行,无并发可言,性能低;但不会出现任何问题。
事务隔离级别 脏读 不可重复读 幻读
读未提交(read-uncommitted)
不可重复读(read-committed)
可重复读(repeatable-read)
串行化(serializable)

注意:这四个级别只是一个标准,各个数据库厂商,并不完全按照标准做的。

3.2 实现(InnoDB)

  • 锁机制:阻止其他事务对数据进行操作, 各个隔离级别主要体现在读取数据时加的锁的释放时机。

    其他还有一些细节不同,主要就是这些

    • RU:事务读取时不加锁
    • RC:事务读取时加行级共享锁(读到才加锁),一旦读完,立刻释放(并不是事务结束)。
    • RR:事务读取时加行级共享锁,直到事务结束时,才会释放。
    • SE:事务读取时加表级共享锁,直到事务结束时,才会释放。
  • MVCC机制:生成一个数据快照,并用这个快照来提供一定级别的一致性读取,也称为多版本数据控制。

    • 实际就是『版本控制』加『读写分离』思想,主要用作于RC和RR级别。
    • 这里面就太细了,主要涉及到事务原理和索引,就不讲了,因为!第一:面试要求讲MVCC的原理比较少,第二:主要我讲了你必然记不住,这也是为什么问的比较少的原因了,因为面试官自己肯定是记不住的。除非像在下一样,每天每天的看,感觉忘了就看。一般人也做不到。



做了3年开发,我们来聊聊MySQL数据库隔离级别


为了能让大家有更好的面试资料去面试大厂的技术岗位,小编花费了2个多月的时间,把市面上的所有的Java面试题,做了一个归纳总结,整理了快200多页,够大家刷题好久了!

好了,废话不多说,本手册目前为第一版,内容有以下目录:Java基础面试题、集合、多线程、Java Spring、Spring AOP、pring Boot、SpringCloud、JVM、Mysql、Redis、MongoDB、RabbitMQ、Dubbo 、MyBatis 、ZooKeeper 、Elasticsearch 、Kafka 等面试题 。


整个小册子目前50万字左右,部分截图:

做了3年开发,我们来聊聊MySQL数据库隔离级别

做了3年开发,我们来聊聊MySQL数据库隔离级别


做了3年开发,我们来聊聊MySQL数据库隔离级别


做了3年开发,我们来聊聊MySQL数据库隔离级别


好了,由于太多,暂时列举部分截图 。大家如果想要,直接使用以下方式获取高清PDF面试手册:


资料获取方法


必须关注下方二维码

在后台回复关键词:手册


关注回复:手册

原创文章,作者:栈长,如若转载,请注明出处:https://www.cxyquan.com/6908.html

发表评论

登录后才能评论

联系我们

400-800-8888

在线咨询:点击这里给我发消息

邮件:admin@example.com

工作时间:周一至周五,9:30-18:30,节假日休息