事务隔离级别

隔离级别

概念理解

事务的概念

  • 事务是数据库管理系统中的一个基本单位,它代表了一组数据库操作。

  • 事务是一个不可分割的工作单元,要么全部成功执行,要么全部失败回滚。

  • 事务的目标是确保数据库的一致性、隔离性、持久性和原子性(ACID属性)。

事务的特性

  • 原子性(Atomicity):事务是原子操作,要么全部成功,要么全部失败回滚。
  • 一致性(Consistency):事务将数据库从一致状态转变为另一个一致状态。
  • 隔离性(Isolation):事务之间是相互隔离的,互不干扰。
  • 持久性(Durability):一旦事务提交成功,其结果将永久保存在数据库中。

隔离级别

首先什么是事务隔离级别?

事务隔离级别是数据库管理系统用来控制多个并发事务之间相互干扰程度的概念。它规定了一个事务在执行期间能够看到其他事务对数据库的修改的程度,以确保数据库的一致性和隔离性。

**未提交读(Read uncommitted)**是最低的隔离级别。通过名字我们就可以知道,在这种事务隔离级别下,一个事务可以读到另外一个事务未提交的数据。这种隔离级别下会存在幻读、不可重复读和脏读的问题。

**提交读(Read committed)**也可以翻译成读已提交,通过名字也可以分析出,在一个事务修改数据过程中,如果事务还没提交,其他事务不能读该数据。所以,这种隔离级别是可以避免脏读的发生的。

可重复读(Repeatable reads),由于提交读隔离级别会产生不可重复读的读现象。所以,比提交读更高一个级别的隔离级别就可以解决不可重复读的问题。这种隔离级别就叫可重复读。但是这种隔离级别没办法解决幻读。

**可串行化(Serializable)**是最高的隔离级别,前面提到的所有的隔离级别都无法解决的幻读,在可序列化的隔离级别中可以解决。

隔离级别与脏读、不可重复读、幻读

隔离级别 DR(脏读) NR(不可重复读) PR(幻读)
RU(读未提交) YES YES YES
RC(读已提交) NO YES YES
RR(可重复读) NO NO YES
Serializable(串行) NO NO NO

YES:表示会出现

NO:表示不会出现

RU:脏读

RC:不可重复读

RR:幻读

serializable:解决所有问题

脏读:读到了其他事务还没有提交的数据。

不可重复读:对某数据进行读取过程中,有其他事务对数据进行了修改(UPDATE、DELETE),导致第二次读取的结果不同。

幻读:事务在做范围查询过程中,有另外一个事务对范围内新增了记录(INSERT),导致范围查询的结果条数不一致。

隔离级别的选择

权衡一致性和性能,一致性和性能之间存在权衡。较高级别的隔离通常提供更好的一致性,但可能降低性能,因为它会引入锁定和资源争夺。读者需要权衡这两个因素,以确定最适合其应用的平衡点。

大厂高并发场景比较多,因此一般会选择RC隔离级别。像一致性要求较高的如金融等行业,通常会选择RR隔离级别。