关系型数据库事务的隔离级别: 读未提交, 读已提交, 可重复读, 序列化。
事务的四性: 原子性,一致性,隔离性,持久性。(4项)
事务的隔离级别: 读未提交, 读已提交, 可重复读, 序列化。(4项)
并发事务可能引起: 脏读, 不可重复读, 幻读。 (3项)
读未提交不能防止 脏读, 不可重复读, 幻读 ;
读已提交级别:可防止脏读。
可重复读级别:可防止脏读,不可重复读。
序列化级别,并发事务只能逐个执行:脏读,不可重复读,幻读,都可以防止。
关系型数据库事务的隔离级别是指在并发境下,事务之间相互隔离的程度。常见的隔离级别包括:读未提交(Read Uncommitted)、读已提交(Read Committed)、可重复读(Repeatable Read)和串行化(Serializable)。
-
读未提交(Read Uncommitted):最低的隔离级别,事务可以读取其他事务未提交的数据。这种隔离级别可能导致脏读(Dirty Read),即读取到未提交的数据。
-
读已提交(Read Committed):事务只能读取其他事务已提交的数据。这种隔离级别可以避免脏读,但可能导致不可重复读(Non-Repeatable Read),即在同一个事务中,多次读取同一数据可能得到不同的结果。
-
可重复读(Repeatable Read):事务在执行期间多次读取同一数据时,结果保持一致。这种隔离级别可以避免脏读和不可重复读,但可能导致幻读(Phantom Read),即在同一个事务中,多次查询同一范围的数据,结果集可能发生变化。
-
串行化(Serializable):最高的隔离级别,事务按照串行的方式执行,避免了脏读、不可重复读和幻读。但是串行化的隔离级别会导致并发性能下降,因为事务需要依次执行。
在实际应用中,选择合适的隔离级别需要根据具体的业务需求和并发访问情况进行权衡。一般来说,读已提交和可重复读是较为常用的隔离级别。
关系型数据库事务的隔离级别是用来定义多个并发事务之间的可见性和相互影响的规范。不同的隔离级别在数据一致性、系统性能和并发控制之间提供了不同的权衡。以下是关系型数据库事务的四个标准隔离级别,从低到高进行介绍:
读未提交(Read Uncommitted):
这是最低的隔离级别。在此级别下,事务可以读取其他未提交事务的数据。由于未提交的数据可能随后会被回滚,因此这种读取称为“脏读”(Dirty Read)。此外,这个级别还可能出现不可重复读和幻读的问题。由于性能并不比其他级别显著优越,且数据一致性得不到保障,这个级别在实际应用中很少使用。
读已提交(Read Committed):
这是大多数数据库系统的默认隔离级别(但不是所有数据库系统,如MySQL的默认隔离级别是Repeatable Read)。在这个级别下,一个事务只能读取已经提交的数据,从而避免了脏读问题。然而,由于其他事务可能在当前事务读取数据后进行提交,因此可能出现不可重复读和幻读的情况。
可重复读(Repeatable Read):
在这个隔离级别下,事务在整个过程中多次读取同一数据将始终看到相同的结果,即数据的“一致性视图”。这避免了脏读和不可重复读的问题。然而,在某些情况下,仍可能出现幻读问题(即在一个事务读取某个范围内的记录时,另一个并发事务插入了新的记录,导致原来的事务在再次读取该范围时看到额外的“幻影”行)。但需要注意的是,在某些数据库系统(如MySQL的InnoDB引擎)中,通过采用多版本并发控制(MVCC)技术,可以在Repeatable Read隔离级别下解决幻读问题。
串行化(Serializable):
这是最高的隔离级别。在此级别下,事务被处理为串行事务,即事务不会并发执行,而是按照顺序一个接一个地执行。这完全消除了脏读、不可重复读和幻读的可能性,但会大大降低系统的并发性能。因此,这个级别通常只在对数据一致性要求极高的场景中使用。
需要注意的是,虽然这些隔离级别的定义是标准的,但不同的数据库系统可能在实现上有所差异。因此,在使用特定数据库系统时,应详细了解其事务隔离级别的具体实现和特性。
脏读 , 不可重复读 , 幻读
脏读、不可重复读和幻读是数据库中的隔级别问题。下面是对这些概念的介绍:
-
脏读(Dirty Read):脏读是指一个事务读取了另一个事务未提交的数据。当一个事务读取了另一个事务正在修改的数据,而这个修改可能会被回滚,那么读取到的数据就是脏数据。脏读可能导致不一致的结果。
-
不可重复读(Non-repeatable Read):不可重复读是指在同一个事务中,多次读取同一数据,但得到的结果不一致。这是因为在这个事务中,其他事务可能已经修改了这个数据。不可重复读可能导致数据的不一致性。
-
幻读(Phantom Read):幻读是指在同一个事务中,多次执行同一个查询,但得到的结果集不一致。这是因为在这个事务中,其他事务可能已经插入或删除了符合查询条件的数据。幻读可能导致查询结果的不一致性。
这些问题的出现与数据库的隔离级别有关。在可重复读隔离级别下,普通的查询是快照读,不会看到其他事务插入的数据,因此不会出现幻读。但是,如果使用当前读,就可能出现幻读的情况。
脏读、不可重复读和幻读是关系型数据库中事务隔离级别所要解决的三类数据不一致性问题。这些问题都是由于多个事务并发执行时对数据的访问和修改产生的冲突所导致的。
-
脏读(Dirty Read):
脏读指的是一个事务读取了另一个未提交事务中的数据。如果那个未提交的事务最后回滚了,那么读取到的数据就是“脏”的,因为它并不是数据库中真正存在的数据。脏读会导致数据的不一致性和不准确性。 -
不可重复读(Non-repeatable Read):
不可重复读发生在一个事务内多次读取同一数据时,由于另一个并发事务的修改导致前后读取到的数据不一致。具体来说,就是在第一个事务读取某个数据后,第二个事务对该数据进行了修改并提交,然后第一个事务再次读取该数据时,发现数据已经发生了变化。不可重复读破坏了事务的隔离性,使得在事务内部无法保持数据的一致性视图。 -
幻读(Phantom Read):
幻读是指在一个事务内多次执行相同的查询,但由于另一个并发事务插入或删除了满足查询条件的数据,导致前后查询结果集不一致。与不可重复读不同,幻读关注的是结果集的变化,而不是单个数据项的变化。例如,一个事务在查询某个范围内的记录时,另一个事务插入了一条新记录,导致原事务再次查询时看到了额外的“幻影”行。幻读同样破坏了事务的隔离性,使得事务无法准确控制其操作的数据范围。
为了解决这些问题,数据库管理系统提供了不同的事务隔离级别。通过选择合适的隔离级别,可以在数据一致性、系统性能和并发控制之间达到平衡。需要注意的是,不同的数据库系统可能在实现这些隔离级别时有所差异,因此在使用特定数据库系统时,应详细了解其事务隔离级别的具体实现和特性。