vlambda博客
学习文章列表

拼多多面试官:说说数据库事务隔离级别

什么是数据库事务?数据库事务是一系列数据库操作的集合,数据库事务是数据库管理系统与文件系统的重要区别之一。

从事务的四个特性谈起

记得之前一个教数据库的老师说过,如果考研复试遇到了她,一定会问什么是ACID。一般学过数据库的同学基本都能说上一些。A指的是Atomicity,也就是「原子性」,原子性是指一个事务的所有操作要么全部做完,要么全部不做,不存在停在中间环节的情况。C指的是Consistency,也就是「一致性」,事务在执行前后,数据保持一致。例如小张给小王转了100块钱,那么小张的账户里少了100元,同时小王的账户里多了100元,但是他们的总金额不变。I是Isolation,是指「隔离性」,数据库允许多个并发事务同时对其数据进行读写和修改,隔离性可以防止多个事务并发执行时由于交叉执行而导致数据的不一致。D指「持久性」(Durability),是指事务一旦结束,对数据的修改就是永久性的。

事务并发带来的问题

事务并发往往会带来一些不可预知的问题,一般可以包括「脏读」、「幻读」、「不可重复读」和「丢失更新」。

脏读

拼多多面试官:说说数据库事务隔离级别

脏读是指事务A未提交的数据被事务B读取,事务A回滚,事务B读到的数据是脏数据。

幻读

拼多多面试官:说说数据库事务隔离级别

幻读是指事务A查询一次数据后,事务B增加或减少了几条数据,事务A再次查询发现和之前查到的数据条数不一致,就好像出现了幻觉一样。

不可重复读

拼多多面试官:说说数据库事务隔离级别

不可重复读是事务A两次查询期间事务B修改了数据,导致事务A两次读取的数据不一致。

丢失更新

拼多多面试官:说说数据库事务隔离级别

丢失更新指的是事务A和事务B同时写一个数据,那么先写的更新就会丢失,还有一种情况是两个事务同时更新一条数据,某一事务回滚导致另一事务的更新也丢失。

事务隔离级别

事务有四种隔离级别,由低到高分别是「读未提交」、「读已提交」、「可重复读」和「可串行化」。

  • 读未提交(READ UNCOMMITTED):读未提交是最低的隔离级别,不同事务之间可以读取未提交的数据,因此可能产生脏读、不可重复读和幻读。

  • 读已提交(READ COMMITTED):读已提交的级别略高于读未提交,事务之间只能读取已经提交的数据,可能产生不可重复读和幻读的问题。

  • 可重复读(REPEATABLE READ):可重复读对同一字段多次读取的结果一致,可以防止脏读和不可重复读,但还是会产生幻读的问题。

  • 可串行化(SERIALIZABLE):可串行化是最高级别的事务隔离级别,是完全串行化执行事务,可以有效防止幻读、不可重复读和脏读。

SKY技术修炼指南 发起了一个读者讨论 欢迎大家一起讨论 精选讨论内容
SKY

最后一张图片可串行化不可能幻读,已经提交无法修改图片,在此更正