1、MySQL 事务有哪些隔离级别、分别有什么特点,以及 MySQL 的默认隔离级别是什么?
读未提交:read uncommitted (最低的隔离级别) 《提交之前就可以读到》
事务A可以读取到事务B未提交的数据
可能会出现 脏读 (Dirty read)、不可重复度、幻读现象
理论情况下
读已提交:read committed (提交之后才能读到)
事务A只能读取到事务B提交之后的数据
解决了脏读现象,但它是不可重复读取数据
每一次读取到的数据是真实数据
可重复读:repeatable read (提交之后也读不到 :读取到开启事务时的数据。事务不结束数据就不会改变)
事务A开启之后,每一次在事务A中读取到的数据都是一致的。即使事务B修改数据,事务A中读取到的数据依然没有改变。
解决了不可以重复读问题
出现幻影读:读取的数据都是幻想
序列化 / 串行化:serializable (最高的隔离级别)
效率最高,解决所有问题
事务要进行排队,不能并发,并发新能低,开销大。
默认情况下MySQL的隔离级别为可重复读
面试官问到这个问题,可能想了解你对 MySQL 事务隔离级别的了解程度,以及你对事务隔离级别对数据的影响、如何选择合适的隔离级别等方面的理解。同时,也可能会考察你对数据库的基本概念和原理的掌握程度。
2、讲一下 Redis 的单线程模型,IO 多路复用是什么?
Redis 是一个基于内存的高性能 key-value 数据库,其单线程模型是指 Redis 在主线程中通过事件循环来处理客户端的请求和内部的任务。Redis 主线程通过阻塞式地监听文件描述符,来实现异步事件的处理。这种单线程模型可以避免多线程之间的竞争和加锁等问题,同时也可以让 Redis 轻松地实现高并发、高吞吐量的处理。
Redis 单线程模型中的 IO 多路复用是指利用操作系统的一些特性,通过同时监听多个文件描述符来实现同时处理多个连接的 I/O 操作。在 Redis 中,通过使用多路复用技术,主线程可以同时监听多个客户端的连接,当某个客户端的连接出现了 I/O 事件时,主线程便可以及时地处理该事件,从而提高了 Redis 的 I/O 效率。
在 Redis 的单线程模型中,虽然主线程只有一个,但是它可以通过 IO 多路复用技术来同时处理多个连接的 I/O 操作,从而实现高效的异步事件处理。
3、什么是 BIO、NIO、AIO?
BIO、NIO、AIO都是Java中网络编程的I/O模型。
BIO(Blocking IO )是JDK1.4之前的传统IO模型,特点就是同步阻塞等待数据,直到数据读取完毕才会返回结果,线程会一直阻塞在read/write 方法上,不能处理其他的IO请求,它的并发性能比较差。
NIO(Non-Blocking IO)是Java 1.4之后新增的IO模型,它支持同步非阻塞式的IO操作。NIO采用了多路复用器来处理IO请求,通过一个线程处理多个IO请求,实现了高并发处理。NIO主要有三个核心概念:Selector、Channel、Buffer。Selector负责监听多个Channel上的事件,Channel可以理解为对原始IO的封装,Buffer则是对数据的封装。
AIO(Asynchronous IO)是Java 1.7之后新增的IO模型,它支持异步非阻塞IO操作。与NIO不同的是,AIO在进行读写操作时不需要像NIO一样一直轮询,而是通过回调函数的方式在数据准备好后通知应用程序进行数据的读取,这样可以更加高效地利用系统资源,提高吞吐量。但是AIO在处理小文件和小数据量时的性能并不如NIO。
三者区别
BIO | AIO | NIO | |
处理IO方式 | 阻塞IO | 非阻塞IO | 异步IO |
缺点 | 并发性能差 | 实现fu’z | 虽弥补了并发能力,NIO代码比较复杂 |
适合场景 | 连接数较小且固定 | 链接数非常多且链接时间比较长 | 连接数多且变化较少 |