关系型数据库的隔离级别 读一致性

来自网络:

三种可防止的现象:

脏读(dirty read):事务可以读取其他事务还没有提交的修改;

不可重复读(nonrepeatable read):事务读取先前曾读取过的数据,发现其他的已提交事务修改或删除了要读取的数据;

幻象读(phantom read):事务再次执行一个查询,发现其他已提交事务插入了新的满足当前查询条件的数据。

针对以上三种现象,SQL92标准指定了4种隔离制度,这4种隔离制度一种比一种严格。

Read uncommitted:允许脏读、不可重复读和幻象读;

Read committed:不允许脏读,允许不可重复读和幻象读;

Repeatable read:不允许脏读、不可重复读,允许幻象读;

Serializable:不允许脏读、不可重复读和幻象读。

Oracle提供Read Committed和Serializable隔离等级,还提供了一种额外的只读模式。其中默认采用Read Committed模式。

Oracle 事务隔离级别

Oracle 支持以下三种事务隔离级别(transaction isolation level)。

隔离级别 描述

已提交读取 Oracle 默认使用的事务隔离级别。事务内执行的查询只能看到查询执行前(而非事务开始前)就已经提交的数据。Oracle 的查询永远不会读取脏数据(未提交的数据)。

Oracle 不会阻止一个事务修改另一事务中的查询正在访问的数据,因此在一个事务内的两个查询的执行间歇期间,数据有可能被其他事务修改。举例来说,如果一个事务内同一查询执行两次,可能会遇到不可重复读取或不存在读取的现象。 
 

串行化 串行化隔离的事务只能看到事务执行前就已经提交的数据,以及事务内 INSERT , UPDATE ,及 DELETE 语句对数据的修改。串行化隔离的事务不会出现不可重复读取或不存在读取的现象。 
 
只读模式 只读事务只能看到事务执行前就已经提交的数据,且事务中不能执行 INSERT , UPDATE ,及 DELETE 语句。

我的理解:

Oracle的默认隔离级别只能保证语句级别的读一致性,如果事务执行了一半,其他的事务提交了,这种影响会体现在这个事务往下的查询中的。

Oracle的串行隔离级别是保证了事务级别的读一致性,在整个事务执行期间,只能看到事务开始执行的那个时间点的状态和本事务在执行期间的影响,其他事务即使提交了,也看不到。

网上有文章说,串行化事务应该在什么样的场景去使用,下面摘抄一段:

符合以下特性的系统适合采用串行化隔离(serializable isolation):

1、数据量大,但事务短小,只会更新较少数据行的数据库

2、两个并发事务修改相同数据的概率较小

3、运行时间相对较长的事务只执行只读操作

这一段我看的不太明白,一个是事务级别的读一致性,一个是语句级别的读一致性,适合什么样的场景,应该是看业务场景的严格程度吧。

后来在翻阅ORACLE的概念手册的时候,发现这段话是出自那里的。既然是ORACLE的官网手册的说法,应该是有指导意义的。可能ORACLE的出发点是在对比已提交读隔离级别和串行隔离级别的区别。因为串行隔离级别要会独占数据的更新操作,所以不能又太多的更新操作或者耗时太长的更新操作,以免与其他事务冲突,造成过多等待,影响性能。或者由于独占事务没有识别到其他事务的更新提交操作而造成ORA-08177: 无法进行串行化访问错误。

时间: 2024-08-11 07:41:11

关系型数据库的隔离级别 读一致性的相关文章

数据库事务隔离级别--读未提交,读已提交,重复读,序列化

参考原文:https://my.oschina.net/bigdataer/blog/1976010 上一篇文章讲述了:数据库主从复制,那么新的问题数据库读写分离对事物是否有影响? 1. 名词 读未提交read-uncommited 读已提交read-commited 重复读repeatable-->可能产生主从数据不一致问题 串行化serializable-->特殊场景-秒杀使用,一般不用 数据库事务的隔离级别有4个,由低到高依次为Read uncommitted.Read committe

理解数据库事务隔离级别以及脏读, 不可重复读, 幻读(转)

  转自:http://blog.csdn.net/sunxing007/article/details/6427290 数据库事务的4个特性: 原子性(atomic): 都成功或者都失败: 一致性(consistency):事务操作之后,数据库所处的状态和业务规则是一致的;比如a,b账户相互转账之后,总金额不变: 隔离性(isolation):操作中的事务不相互影响; 持久性(durability):事务提交后被持久化到数据库. 脏读,不可重复读, 幻读 幻读phantom read:事务1读

分布式系统中的一致性,与数据库的隔离级别

一致性,是描述多副本的同步特征(本文我们不讨论分布式数据库中,保持多个分片里的数据在业务逻辑上一致性的情况,仅讨论数据多副本的case).一般从两个角度来研究: 从全局数据角度来看: 强一致性: 无论谁.无论何时读,得到的都是最新写入后的结果 线性一致性: 如果把读写操作按照严格时间戳排序,每个进程的读写都遵循该排序的结果 顺序一致性: 每个进程的读写操作顺序都一致,但不保证按照时间戳顺序 因果一致性: 两个有因果关系(读写了同一数据)的进程之间,读写顺序都一致,不保证按照时间戳顺序,而且无关的

数据库事务隔离级别-- 脏读、幻读、不可重复读

一.数据库事务隔离级别 数据库事务的隔离级别有4个,由低到高依次为Read uncommitted .Read committed .Repeatable read .Serializable ,这四个级别可以逐个解决脏读 .不可重复读 .幻读 这几类问题. √: 可能出现    ×: 不会出现   脏读 不可重复读 幻读 Read uncommitted √ √ √ Read committed × √ √ Repeatable read × × √ Serializable × × × 注意

数据库:自己理解的“数据库事务隔离级别”

转载请注明出处: jiq?钦's technical Blog - 季义钦 引言:在网上搜了很多关于事务的文章,感觉单独来看都很难看懂,所以综合自己的理解写一篇我自己能理解的关于关系型数据库事务的文章. 一.事务特征 我们都知道数据库事务具备ACID特性: Atomic(原子性):一个事务要么成功,要么失败 Consistency(一致性):一致性代表了底层数据存储的完整性.事务执行前后数据库都必须处于一个合法的状态.什么才是一个合法的状态? 比如满足数据库的唯一性约束.数据类型验证.引用完整性

数据库事务隔离级别与锁

一.事务的4个基本特征     所谓事务是用户定义的一个数据库操作序列,这些操作要么全做要么全不做,是一个不可分割的工作单位.例如,在关系数据库中,一个事务可以是一条SQL语句.一组SQL语句或整个程序. 事务ACID特性. ACID就是:原子性(Atomicity ).一致性( Consistency ).隔离性或独立性( Isolation)和持久性(Durabilily). 事务和程序是两个概念.一般地讲,一个程序中包含多个事务.事务的开始与结束可以由用户显式控制.如果用户没有显式地定义事

数据库事务隔离级别(转)

1.什么是事务,事务的特性是什么? 在数据库中事务是工作的逻辑单元,一个事务是由一个或多个完成一组的相关行为的SQL语句组成,通过事务机制确保这一组SQL语句所作的操作要么都成功执行,完成整个工作单元操作,要么一个也不执行. SQL92标准定义了数据库事务的四个特点: 原子性(Atomicity):一个事务里面所有包含的SQL语句是一个执行整体,不可分割,要么都做,要么都不做. 一致性(Consistency):事务开始时,数据库中的数据是一致的,事务结束时,数据库的数据也应该是一致的. 隔离性

数据库的隔离级别

关于数据库事务隔离级别的介绍 事务(Transaction)是并发控制的基本单位.所谓的事务,它是一个操作序列,这些操作要么都执行,要么都不执行,它是一个不可分割的工作单位.例如,银行转账工作:从一个账号扣款并使另一个账号增款,这两个操作要么都执行,要么都不执行.所以,应该把它们看成一个事务.事务是数据库维护数据一致性的单位,在每个事务结束时,都能保持数据一致性. 针对上面的描述可以看出,事务的提出主要是为了解决并发情况下保持数据一致性的问题. 事务具有以下4个基本特征. ● Atomic(原子

4.事务提交过程,事务基本概念,Oracle中的事务生命周期,保存点savepoint,数据库的隔离级别

 事务提交过程 事务 基本概念 概念:一个或者多个DML语言组成 特点:要么都成功,要么都失败 事务的隔离性:多个客户端同时操作数据库的时候,要隔离它们的操作, 否则出现:脏读  不可重复读  幻读 Oracle默认情况下,事务是打开的 commit案例: SQL> create table t1(tid int,tname varchar2(20)); 表已创建. SQL> select * from tab; TNAME                          TABTYPE