ORACLE事物隔离级别和脏读、幻读、不可重复读区别
一、事务和隔离级别
事务的概念;事务是把对数据库的一系列操作都看做一个整体,要么全部成功,要么全部失败,利用事务我们可以保证数据库的完整性,事务具有原子性。
隔离级别:隔离级别定义了事务与事务之间的隔离距离。
事务的隔离级别如下图:其中 读已提交(READ COMMITTED) 是ORACLE的默认事务隔离级别

举例理解不同的隔离级别:脏读、不可重复读、幻想读
脏读(Read Uncommitted)
通俗的讲,一个事务在处理过程中读取了另外一个事务未提交的数据。(你都还没提交,我就读到了你刚操作的数据,万一你回滚了怎么办,你说这脏不脏。)
举例(事务B未提交,事务A却读到了事务B未提交的数据):

不可重复读(nonrepeated read):同一查询在同一事务中多次进行,由于其他事务提交所做的修改或删除,导致每次返回的结果不同,此时发生不可重复读。
通俗的讲,一个事务范围内,多次查询某个数据,却得到不同的结果。
与脏读的区别:脏读是读到未提交的数据,而不可重复读读到的却是已经提交的数据,(但实际上是违反了事务的一致性原则)。
举例(事务B提交后,事务A却读到了事务B已提交的数据,导致事务A两次读到地数据不一致):

幻想读(phantom read):同一查询在同一事务中多次进行,由于其他事务提交所做的插入操作,每次发生的不同的结果集,此时发生幻读。
事务A读取与搜索条件相匹配的若干行。事务B插入符合A事务查询条件的新行并提交B事务,然后事务A使用相同的条件再次查询结果集中可以看到事务B插入的记录,这条新纪录就像是幻想。
举例(id主键唯一,事务A搜索id=10的数据,事务A搜索不到id=10的数据,然后事务B新增id=10的数据并提交,事务A再次搜索id=10有记录)

不可重复读和幻想读的区别:相同的是两者均为读取到已经提交的数据,不同的是前者强调Delete、Update的数据,后者强调Insert的数据。
二、Oracle的隔离级别
Oracle的事务隔离级别:
Oracle提供read committed和serializable,并提供了一个非SQL标准的read-only级别。
Read commit:
①这是oracle默认的隔离级别;
②保证了不会出现脏读,但是允许出现非重复读和幻读。
Serializable:
①serializable使事务看起来一个接着一个地顺序执行(从效果上可以这样理解)
②只能看见在本事务开始前其他事务提交的更改和本事务中所做的更改.
③保证不会出现脏读、不可重复读和幻读。
④Serializable隔离级别提供了read-only事务所提供的读一致性,同时又允许DML(update/insert/delete)操作。
三、设置Oracle的隔离级别
Oracle设置事务的隔离级别:
设置一个事务的隔离级别:
Set transaction isolation level read committed;
Set transaction isolation level serializable;
Set transaction read only;
设置整个会话的隔离级别:
Alter session set isolation level serializable;
Alert session set isolation level read committed;
四、oracle事务提交机制
Oracle中的事务
1、起始标志: 事务中的第一条DML语句,即数据修改(增、删、改)的语句
2、结束标志: 提交: 显式 commit 隐式: 正常退出、DDL、DCL
回滚: 显式 rollback 隐式: 非正常退出 掉电 宕机
提交数据有三种类型:
显式提交、隐式提交及自动提交。
1、显式提交:用COMMIT命令直接完成的提交为显式提交。其格式为:SQL>COMMIT;
2、隐式提交:用SQL命令间接完成的提交为隐式提交。这些命令是:ALTER,AUDIT,COMMENT,CONNECT,CREATE,DISCONNECT,DROP,EXIT,GRANT,NOAUDIT,QUIT,REVOKE,RENAME。(此隐式提交是在自己的session,如果在其他人的session(如用户a)中正在修改相同的数据,则引起隐式提交的语句(用户a的k另一个session)则必需等待)
3、自动提交:若把AUTOCOMMIT设置为ON,则在插入、修改、删除语句执行后,系统将自动进行提交,这就是自动提交。其格式为:SQL>SET AUTOCOMMIT ON;
查看当前是否是自动提交:show autocommit;
隐式提交:
隐式提交的定义
又名自动提交,即无需显示执行commit语句,session中的操作被自动提交到数据库的过程。
隐式提交的方式
1、正常执行完ddl语句。包括create,alter,drop,truncate,rename。
2、正常执行完dcl语句。包括grant,revoke。
3、正常退出isql*plus,没有明确发出commit或者rollback。
隐式提交的注意事项
1、执行ddl语句时,前面的dml操作也会被提交到数据库中
因为是在一个session里,那执行ddl语句的时候前面的dml语句肯定也会“不可幸免”的被提交到库中。
2、即使ddl语句执行失败,前面的dml操作也会被提交到数据库中
这就有点儿让人奇怪了,ddl都执行失败了,怎么还会提交呢?这就需要探究一下隐式提交的本质了(下文有叙述)。
3、在前面1和2的基础上总结
为了避免隐式提交或者回滚,尽量保证一条或者几条DML操作完成后有显示的提交或者回滚,防止后续执行的DCL或者DDL自动提交前期的DML操作。
隐式提交的本质
1、一条ddl语句执行了两次commit
commit;
ddl statement;
commit;
第一个commit将当前session中未提交的事务隐式提交,以保证ddl语句失败时的回滚位置。
第二个commit将ddl
2、为什么需要隐式提交?
为了保证事务的一致性。我们在执行ddl语句的时候,oracle需要在它的系统表中进行元数据的记录操作(即:除了建表还会进行不少insert操作),如果它不隐式提交就无法保证一致性;从内部运行机制来看ddl语句和dml语句还是有很大区别的,dml会对每个语句的每条记录都做日志记录以便于回滚,而ddl往往没必要搞这么复杂,从功能和易用性上看隐式提交都是最好的选择。
ORACLE事物隔离级别和脏读、幻读、不可重复读区别的更多相关文章
- MySQL进阶15--TCL事务控制语言--建立结束事务/设置断点--默认隔离级别--脏读/幻读/不可重复读
#TCL事物控制语言 : /* Transaction control language : 事物控制语言 事务: 一个或者一组sql语句组成一个执行单元,这个执行单元要么全部执行,要么全部不执行; ...
- Innodb 中 RR 隔离级别能否防止幻读?
问题引出 我之前的一篇博客 数据库并发不一致分析 有提到过事务隔离级别以及相应加锁方式.能够解决的并发问题. 标准情况下,在 RR(Repeatable Read) 隔离级别下能解决不可重复读(当行修 ...
- InnoDB在MySQL默认隔离级别下解决幻读
1.结论 在RR的隔离级别下,Innodb使用MVVC和next-key locks解决幻读,MVVC解决的是普通读(快照读)的幻读,next-key locks解决的是当前读情况下的幻读. 2.幻读 ...
- mysql事务隔离级别、脏读、幻读
Mysql事务隔离级别本身很重要,再加上可能是因为各大公司面试必问的缘故,在博客中出现的概率非常高,但不幸的是,中国的技术博客要么是转载,要么是照抄,质量参差不齐,好多结论都是错的,对于心怀好奇之心想 ...
- SQL Server 中的事务与事务隔离级别以及如何理解脏读, 未提交读,不可重复读和幻读产生的过程和原因
原本打算写有关 SSIS Package 中的事务控制过程的,但是发现很多基本的概念还是需要有 SQL Server 事务和事务的隔离级别做基础铺垫.所以花了点时间,把 SQL Server 数据库中 ...
- SQL Server中的事务与其隔离级别之脏读, 未提交读,不可重复读和幻读
原本打算写有关 SSIS Package 中的事务控制过程的,但是发现很多基本的概念还是需要有 SQL Server 事务和事务的隔离级别做基础铺垫.所以花了点时间,把 SQL Server 数据库中 ...
- mysql事物隔离级别
mysql实现了四种隔离级别 Read Uncommitted(未提交读) 在该隔离级别,所有事务都可以看到其他未提交事务的执行结果.本隔离级别很少用于实际应用,因为它的性能也不比其他级别好多少.读取 ...
- Hibernate 事物隔离级别
Hibernate事务和并发控制 ++YONG原创,转载请注明 1. 事务介绍: 1.1. ...
- Oracle中事物处理--事物隔离级别
n 事物隔离级别 概念:隔离级别定义了事物与事物之间的隔离程度. ANSI/ISO SQL92标准定义了一些数据库操作的隔离级别(这是国际标准化组织定义的一个标准而已,不同的数据库在实现时有所不同) ...
- spring事务隔离级别以及脏读 不可重复读 幻影读
隔离级别 声明式事务的第二个方面是隔离级别.隔离级别定义一个事务可能受其他并发事务活动活动影响的程度.另一种考虑一个事务的隔离级别的方式,是把它想象为那个事务对于事物处理数据的自私程度. 在一个典型的 ...
随机推荐
- 3张大图剖析HttpClient和IHttpClientFactory在解决DNS解析问题上的殊途同归
在开发者便利度角度,我们很轻松地使用HttpClient对象发出HTTP请求,只需要关注应用层协议的BaseAddr.Url.ReqHeader.timeout. 实际在HttpClient在源码级别 ...
- php 安装使用 seaslog扩展
这是一个高性能的日志记录扩展,能迅速帮你格式化的写入日志文件. 首先来看安装: sudo pecl install seaslog 一句话搞定,然后更新php.ini配置文件 添加启用以及一部分配置 ...
- mysql 触发器阻止不合理数据插入
今天看到有人问如何判断处理有不符合的数据阻止插入.比如这个数据只能在90天内存在一条,如果有了就拒绝插入. 当然大家都说用代码判断,判断一下90天内是否有数据,有就拒绝. 我这里说一个使用触发器的思路 ...
- 初步学习Nuxt3
Nuxt3 用于制作ssr 网页 支持vue3 所有的语法,并且支持了TypeScript, vite+vue3+composition api + ts.SPA单页面应用不能进行SEO优化,SSR应 ...
- cornerstone中raft_server_req_handlers源码解析
1.概述 之前说过raft_server是cornerstone的核心,其中充满了很多req的发送,那么follower收到leader的req会怎么处理呢? 本文就是来解析cornerstone中处 ...
- 论文泛读《T-Miner: A Generative Approach to Defend Against Trojan Attacks on DNN-based Text Classification》
发表时间:2021 期刊会议:30th USENIX Security Symposium 论文单位:Virginia Tech 论文作者:Ahmadreza Azizi,Ibrahim Asadul ...
- IEDA 控制台乱码解决
1.修改idea 目录下的文件 idea64.exe.vmoptions idea.exe.vmoptions 在这个文件尾部增加 -Dfile.encoding=UTF-8 2.编辑ieda 文件配 ...
- Dapper.SimpleCRUD:Dapper的CRUD助手
我们在项目开发中,面对一些高并发.大数据量等业务场景,往往对SQL语句的性能要求比较高,这个时候为了方便灵活控制,我们一般就会编写原生的SQL. Dapper就是一个非常高性能的轻量级ORM框架,Da ...
- 从底层源码深入分析Spring的IoC容器初始化过程
IOC容器的初始化整体过程 Spring是如何实现将资源配置(以xml配置为例)通过加载,解析,生成BeanDefination并注册到IoC容器中的?这主要会经过以下 4 步: 从XML中读取配置文 ...
- 【Amadeus原创】wordpress批量更新图片路径的方法
连上wordpress数据库,怼一句: UPDATE wp_posts SET post_content = REPLACE( post_content, '旧域名', '新域名' );