数据库事务四种隔离级别

阿豪吖 阿豪吖     2022-11-13     555

关键词:


在数据库操作中,为了有效保证并发读取数据的正确性,提出的事务隔离级别。

数据库事务的隔离级别有4个,由低到高依次为Read uncommitted(未授权读取、读未提交)、Read committed(授权读取、读提交)、Repeatable read(可重复读取)、Serializable(序列化),这四个级别可以逐个解决脏读、不可重复读、幻读这几类问题。


问题的提出:
之所以提出事务隔离级别,是因为在一个事务执行过程中,可能会出现以下几种情况:

1、更新丢失
两个事务都同时更新一行数据,一个事务对数据的更新把另一个事务对数据的更新覆盖了。这是因为系统没有执行任何的锁操作,因此并发事务并没有被隔离开来。
2、脏读
一个事务读取到了另一个事务未提交的数据操作结果。
3、不可重复读(Non-repeatable Reads):一个事务对同一行数据重复读取两次,但是却得到了不同的结果。
包括以下情况:
(1) 虚读:事务T1读取某一数据后,事务T2对其做了修改,当事务T1再次读该数据时得到与前一次不同的值。
(2) 幻读(Phantom Reads):事务在操作过程中进行两次查询,第二次查询的结果包含了第一次查询中未出现的数据或者缺少了第一次查询中出现的数据(这里并不要求两次查询的SQL语句相同)。这是因为在两次查询过程中有另外一个事务插入数据造成的。

 

下面介绍一下这几种事务隔离级别的区别以及可能出现的问题:

Read uncommitted(未授权读取、读未提交):

如果一个事务已经开始写数据,则另外一个事务则不允许同时进行写操作,但允许其他事务读此行数据。该隔离级别可以通过“排他写锁”实现。

避免了更新丢失,却可能出现脏读。也就是说事务B读取到了事务A未提交的数据。

Read committed(授权读取、读提交):

读取数据的事务允许其他事务继续访问该行数据,但是未提交的写事务将会禁止其他事务访问该行。

该隔离级别避免了脏读,但是却可能出现不可重复读。事务A事先读取了数据,事务B紧接了更新了数据,并提交了事务,而事务A再次读取该数据时,数据已经发生了改变。

Repeatable read(可重复读取):

读取数据的事务将会禁止写事务(但允许读事务),写事务则禁止任何其他事务。

避免了不可重复读取和脏读,但是有时可能出现幻读。这可以通过“共享读锁”和“排他写锁”实现。


Serializable(序列化):

提供严格的事务隔离。它要求事务序列化执行,事务只能一个接着一个地执行,但不能并发执行。如果仅仅通过“行级锁”是无法实现事务序列化的,必须通过其他机制保证新插入的数据不会被刚执行查询操作的事务访问到。

序列化是最高的事务隔离级别,同时代价也花费最高,性能很低,一般很少使用,在该级别下,事务顺序执行,不仅可以避免脏读、不可重复读,还避免了幻像读。


隔离级别越高,越能保证数据的完整性和一致性,但是对并发性能的影响也越大。对于多数应用程序,可以优先考虑把数据库系统的隔离级别设为Read Committed。它能够避免脏读取,而且具有较好的并发性能。尽管它会导致不可重复读、幻读和第二类丢失更新这些并发问题,在可能出现这类问题的个别场合,可以由应用程序采用悲观锁或乐观锁来控制。

 

大多数数据库的默认级别就是Read committed,比如Sql Server , Oracle。
Mysql的默认隔离级别就是Repeatable read。

原文链接:https://blog.csdn.net/tolcf/article/details/49283575

 

数据库事务的四种隔离级别

 数据库事务的隔离级别有4个,由低到高依次为: Readuncommitted未授权读取读未提交读可允许其他两个事务不能同时进行写操作事务B读取事务A为提交的数据避免更新丢失会出现脏读 Readcommitted  授权读取读提交... 查看详情

mysql四种隔离级别

...ability)。这四个特性简称为ACID特性。1、原子性。事务是数据库的逻辑工作单位,事务中包含的各操作要么都做,要么都不做2、一致性。事务执行的结果必须是使数据库从一个一致性状态变到另一个一致性状态。因此当数据库... 查看详情

数据库的四种隔离级别

 一、事务的概念   一个事务中的一系列的操作要么全部成功,要么一个都不做。   事务的结束有两种,当事务中的所有步骤全部成功执行时,事务提交。如果其中一个步骤失败,将发生回滚操作,撤消... 查看详情

四种事务隔离级别

...别事务具有原子性、一致性、隔离型、持久性。使用Mysql数据库说明事务隔离级别:  mysql支持事务的常用引擎是InnoDB  mysql默认事务隔离级别可重复读(REPEATABLE-READ):使用showvariableslike‘tx_isolation‘查看  注:以下第二... 查看详情

数据库事务隔离的四种级别

隔离级别按照下面表格的顺序,依次递增,并行能力依次递减,竞争性也就逐渐增强,随之而来的就是性能和扩展性的下降。?脏读:只读到了其他事务回滚前的脏数据。即,当前事务读到了其他事务想要修改但没有修改成功的... 查看详情

数据事务四种隔离机制和七种传播行为

一、隔离级别:数据库事务的隔离级别有4个,由低到高依次为Readuncommitted、Readcommitted、Repeatableread、Serializable,这四个级别可以逐个解决脏读、不可重复读、幻读这几类问题。1. ISOLATION_READ_UNCOMMITTED:这是事务最低的隔离... 查看详情

数据事务四种隔离机制和七种传播行为

一、隔离级别:数据库事务的隔离级别有4个,由低到高依次为Readuncommitted、Readcommitted、Repeatableread、Serializable,这四个级别可以逐个解决脏读、不可重复读、幻读这几类问题。1. ISOLATION_READ_UNCOMMITTED:这是事务最低的隔离... 查看详情

数据库事务的隔离级别

MySQL数据库为我们提供的四种隔离级别:①Serializable(串行化):可避免脏读、不可重复读、幻读的发生。②Repeatableread(可重复读):可避免脏读、不可重复读的发生。③Readcommitted(读已提交):可避免脏读的发生。④Readuncommitted(读未... 查看详情

mysql的四种事务隔离级别

...性(Consistency):事务开始前和结束后,数据库的完整性约束没有被破坏。比如A向B转账,不可能A扣了钱ÿ 查看详情

数据库的四种隔离级别和事务的四特性(代码片段)

数据库事务的四大特性:事务(Transaction)是并发控制的基本单位。所谓事务,它是一个操作序列,这些操作要么都执行,要么都不执行,它是一个不可分割的工作单位。例如,银行转帐工作:从一个帐号扣款并使另一个帐号增款... 查看详情

事务的四种隔离级别和七种传播行为

...的避免幻读、不可重复读、脏读等问题,但会极大的降低数据库的并发能力。所以说不可重复读和幻读最大的区别,就在于如何通过锁机制来解决他们产生的问题。  数据库中事务的四大特性(ACID)(1)原子性⑵一致性⑶... 查看详情

数据库事务的四种隔离级别

1.引言数据库事务的隔离级别有4种,由低到高分别为Readuncommitted(读未提交)、Readcommitted(读已提交)、Repeatableread(重复读)、Serializable(序列化)。读现象是在多个事务并发执行时,在... 查看详情

mysql原理篇之事务隔离级别和mvcc--13(代码片段)

Mysql原理篇之事务隔离级别和MVCC--13事前准备事务隔离级别事务并发执行遇到的问题SQL标准中的四种隔离级别MySQL中支持的四种隔离级别如何设置事务的隔离级别MVCC原理版本链ReadViewREADCOMMITTED——每次读取数据前都生成一个ReadView... 查看详情

事务及事务隔离级别

什么是事务事务是访问数据库的一个操作序列,数据库应用系统通过事务集来完成对数据库的存取。事务的正确执行使得数据库从一种状态转换为另一种状态。事务必须服从ISO/IEC所制定的ACID原则。ACID是原子性(atomicity)、一致... 查看详情

事务隔离级别实现原理(代码片段)

...个事务可以读到另外一个事务未提交的数据。未提交读的数据库锁情况(实现原理)事务在读数据的时候并未对数据加锁。事务在修改数据的时候只对数据增加行级共享锁。现象事务1读取某行记录时,事务2也能对这行记录进行... 查看详情

深入分析事务的隔离级别

...不同的级别能解决什么样的读现象。并且介绍了在关系型数据库中不同的隔离级别的实现原理。在DBMS中,事务保证了一个操作序列可以全部都执行或者全部都不执行(原子性),从一个状态转变到另外一个状态(一致性)。由... 查看详情

深入分析事务的隔离级别

...不同的级别能解决什么样的读现象。并且介绍了在关系型数据库中不同的隔离级别的实现原理。在DBMS中,事务保证了一个操作序列可以全部都执行或者全部都不执行(原子性),从一个状态转变到另外一个状态(一致性)。由... 查看详情

spring事务失效

...quo;四种”的隔离级别枚举:/***【Spring独有】使用后端数据库默认的隔离级别**MySQL默认采用的REPEATABLE_READ隔离级别*Oracle默认采用的READ_COMMITTED隔离级别*/intISOLATION_DEFAULT=-1;/***最低的隔离级别,允许读取尚未提 查看详情