数据库的隔离级别相关的一些面试

你好,我是风一样的树懒,一个工作十多年的后端开发,曾就职京东、阿里等多家互联网头部企业。

点击下方👇关注公众号,带你一起复习后端技术,看看面试考点,补充积累技术知识,每天都为面试准备积累

01
数据库的四种隔离级别


数据库的四种隔离级别由低到高分别是:


读未提交(Read Uncommitted):事务可以读取其他未提交事务的数据,可能导致脏读问题,即读取到未提交的数据。


读已提交(Read Committed):事务只能读取其他已提交事务的数据,避免了脏读,但可能出现不可重复读,即同一事务中多次读取同一数据可能得到不同结果。


可重复读(Repeatable Read):确保在同一事务中多次读取同一数据结果一致,避免了不可重复读,但可能出现幻读,即在读取范围数据时,其他事务插入了新数据,导致前后读取结果不一致。


可串行化(Serializable):最高的隔离级别,通过对读取的数据行加锁,防止其他事务进行插入、更新或删除操作,避免了幻读,但可能导致性能下降和锁竞争。

02
什么是脏读、不可重复读和幻读?


脏读:一个事务读取了另一个未提交事务的数据,如果该数据被回滚,前者读取到的数据就是无效的。


不可重复读:在同一事务中,多次读取同一数据,结果可能不同,通常是因为其他已提交事务对该数据进行了更新。


幻读:在同一事务中,多次查询某个范围的数据,结果集可能不同,通常是因为其他已提交事务在该范围内插入了新数据。


03
如何在数据库中设置事务的隔离级别?


以 MySQL 为例,可以使用以下命令设置事务的隔离级别:

-- 设置全局隔离级别SET GLOBAL TRANSACTION ISOLATION LEVEL REPEATABLE READ;-- 设置当前会话的隔离级别SET SESSION TRANSACTION ISOLATION LEVEL READ COMMITTED;

在 Java 中,使用 JDBC 可以通过 Connection 对象的 setTransactionIsolation 方法设置隔离级别:

connection.setTransactionIsolation(Connection.TRANSACTION_REPEATABLE_READ);

04
在实际应用中,如何选择合适的隔离级别?


选择隔离级别需要在数据一致性和系统性能之间权衡:

读未提交:几乎不使用,因为可能导致脏读。

读已提交:适用于对一致性要求不高,但需要避免脏读的场景。

可重复读:适用于需要确保同一事务中多次读取数据一致性的场景。

可串行化:适用于对数据一致性要求极高且并发量较低的场景。


05
数据库默认的隔离级别是啥


数据库的默认隔离级别因数据库管理系统(DBMS)而异。以下是一些常见数据库的默认隔离级别:

  • MySQL:默认隔离级别为可重复读(Repeatable Read)。 

    CSDN博客

  • Oracle:默认隔离级别为读已提交(Read Committed)。 

    知乎专栏

  • SQL Server:默认隔离级别为读已提交(Read Committed)。

需要注意的是,不同的隔离级别在数据一致性和系统性能之间进行了不同的权衡。


今天的内容就分享到这儿,喜欢的朋友可以关注,点赞。有什么不足的地方欢迎留言指出,您的关注是我前进的动力!

END


扫码关注

一起积累后端知识
不积跬步,无以至千里
不积小流,无以成江海

喜欢此内容的人还喜欢

《Java面试题指南》回归啦~


一个阿里二面面试官必问的问题


Lambda表达式说爱你不容易


分享面试:mysql数据库索引失效的情况


Spring-Boot中一个不起眼的好工具StopWatch