一、事务和隔离级别

  事务的概念;事务是把对数据库的一系列操作都看做一个整体,要么全部成功,要么全部失败,利用事务我们可以保证数据库的完整性,事务具有原子性。

  隔离级别:隔离级别定义了事务与事务之间的隔离距离。

  事务的隔离级别如下图:其中 读已提交(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事物隔离级别和脏读、幻读、不可重复读区别的更多相关文章

  1. MySQL进阶15--TCL事务控制语言--建立结束事务/设置断点--默认隔离级别--脏读/幻读/不可重复读

    #TCL事物控制语言 : /* Transaction control language : 事物控制语言 事务: 一个或者一组sql语句组成一个执行单元,这个执行单元要么全部执行,要么全部不执行; ...

  2. Innodb 中 RR 隔离级别能否防止幻读?

    问题引出 我之前的一篇博客 数据库并发不一致分析 有提到过事务隔离级别以及相应加锁方式.能够解决的并发问题. 标准情况下,在 RR(Repeatable Read) 隔离级别下能解决不可重复读(当行修 ...

  3. InnoDB在MySQL默认隔离级别下解决幻读

    1.结论 在RR的隔离级别下,Innodb使用MVVC和next-key locks解决幻读,MVVC解决的是普通读(快照读)的幻读,next-key locks解决的是当前读情况下的幻读. 2.幻读 ...

  4. mysql事务隔离级别、脏读、幻读

    Mysql事务隔离级别本身很重要,再加上可能是因为各大公司面试必问的缘故,在博客中出现的概率非常高,但不幸的是,中国的技术博客要么是转载,要么是照抄,质量参差不齐,好多结论都是错的,对于心怀好奇之心想 ...

  5. SQL Server 中的事务与事务隔离级别以及如何理解脏读, 未提交读,不可重复读和幻读产生的过程和原因

    原本打算写有关 SSIS Package 中的事务控制过程的,但是发现很多基本的概念还是需要有 SQL Server 事务和事务的隔离级别做基础铺垫.所以花了点时间,把 SQL Server 数据库中 ...

  6. SQL Server中的事务与其隔离级别之脏读, 未提交读,不可重复读和幻读

    原本打算写有关 SSIS Package 中的事务控制过程的,但是发现很多基本的概念还是需要有 SQL Server 事务和事务的隔离级别做基础铺垫.所以花了点时间,把 SQL Server 数据库中 ...

  7. mysql事物隔离级别

    mysql实现了四种隔离级别 Read Uncommitted(未提交读) 在该隔离级别,所有事务都可以看到其他未提交事务的执行结果.本隔离级别很少用于实际应用,因为它的性能也不比其他级别好多少.读取 ...

  8. Hibernate 事物隔离级别

      Hibernate事务和并发控制                                            ++YONG原创,转载请注明 1.    事务介绍: 1.1.        ...

  9. Oracle中事物处理--事物隔离级别

    n  事物隔离级别 概念:隔离级别定义了事物与事物之间的隔离程度. ANSI/ISO SQL92标准定义了一些数据库操作的隔离级别(这是国际标准化组织定义的一个标准而已,不同的数据库在实现时有所不同) ...

  10. spring事务隔离级别以及脏读 不可重复读 幻影读

    隔离级别 声明式事务的第二个方面是隔离级别.隔离级别定义一个事务可能受其他并发事务活动活动影响的程度.另一种考虑一个事务的隔离级别的方式,是把它想象为那个事务对于事物处理数据的自私程度. 在一个典型的 ...

随机推荐

  1. AI那么厉害,那测试开发和自动化测试这些职位是不是就多余了?

    在当今科技飞速发展的时代,AI大模型如ChatGPT等如同璀璨星辰般闪耀登场,它们的强大功能引发了各个领域的诸多思考.在软件测试领域,不少人心里直犯嘀咕:这AI大模型都这么厉害了,那测试开发和自动化测 ...

  2. ABP实践(5)-abp前端vue框架之IView实现三级菜单(博友需要特此分享)

    为响应博友想要知道三级菜单怎么实现本篇文章先介绍三级菜单的实现,后续再分享其他部分内容 1 修改菜单组件sidebarMenu.vue 图为原代码和修改后代码比对 修改前后的源码如下 <styl ...

  3. Contrastive Learning 对比学习 | RL 学 representation 时的对比学习

    记录一下读的三篇相关文章. 01. Representation Learning with Contrastive Predictive Coding arxiv:https://arxiv.org ...

  4. Python框架之FastAPI

    原起: 最近项目中现存的是使用的python的异步方式进行开发, 但是只是存在脚本部分, 并没有提供对外的Web服务,正好趁机将Fastapi嵌入其中使用. 官方文档: https://fastapi ...

  5. golang之函数工具库lancet

    lancet(柳叶刀)是一个全面.高效.可复用的go语言工具函数库. lancet受到了java apache common包和lodash.js的启发. 简体中文 | English 特性 全面.高 ...

  6. 好消息,在 Visual Studio 中可以免费使用 GitHub Copilot 了!

    前言 今天大姚给大家分享一个好消息,GitHub Copilot 可以免费使用了!在此之前若开发者要使用 GitHub Copilot 需要付费订阅,每月订阅费用起步价为 10 美元,而经过验证的学生 ...

  7. opencv+Linux源码编译安装及引用

    (一)下载 opencv下载地址:https://opencv.org/releases/ opencv_contrib下载地址:https://github.com/opencv/opencv_co ...

  8. 【C#】【平时作业】习题-4-流程控制

    T1 创建一个Windows应用程序,先输入年龄值,再判断是否大于18,最后显示判断结果,运行效果如图所示. 提示: 注意保持逻辑完整: 引用数据需要明确出处. [程序代码] private void ...

  9. 【前端】【H5 API】地理定位(获取经纬度)

    H5 API 地理定位 地理定位在日常生活中应用比较广泛,例如,互联网打车.在线地图等.在HTML 5的规范中,增加了获取用户地理位置信息的接口Geolocation,开发者可以通过经纬度来获取用户的 ...

  10. 【转载】 一次生产环境的NOHTTPRESPONSEEXCEPTION异常的排查记录

    https://www.freesion.com/article/41531004212/ 环境: jdk1.8+tomcat8+httpclient4.5.2 主要现象: 项目偶发出现org.apa ...