一、事务和隔离级别

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

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

  事务的隔离级别如下图:其中 读已提交(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. 网站免费https加密教程

    为网站实现HTTPS加密可以大大提高网站的安全性和用户信任度.以下是一个详细的免费HTTPS加密教程: 一.选择免费SSL证书提供商 JoySSL:这是目前国内为数不多的国产CA服务商打造的自主品牌S ...

  2. 高性能计算-gemm串行计算优化(3)

    目标:Darknet 源码cpu矩阵乘法函数 gemm_nn 优化.参数说明:lda A的列数; ldb B的列数; ldc C的列数; M C的行数; K A的列数 测试方法:Darknet源码,m ...

  3. Myeclipse优化:自动转义字符串中的特殊字符

    在Myeclipse或者Eclipse中,将一段带引号(或其他的需要转义)字符串黏贴到引号中,双引号默认不会自动转义,手工一个一个去转义(变成\")的话实在是费事,这里记录一下让Myecli ...

  4. Java Study For Five Day( 面向对象一)

    面向对象 1.面向对象的概念 2.理解面向对象 *面向对象其实是相对面向过程而言的,面向对象和面向过程都是一种思想,它们所强调的内容不一样. *面向对象:强调的是功能的行为,将功能进行了封装成了对象, ...

  5. 一款.NET开源的Windows资源管理器标签页工具

    前言 今天大姚给大家分享一款基于.NET开发的可以让你在Windows资源管理器中使用Tab多标签功能的小工具:QTTabBar. 工具介绍 QTTabBar是一款基于.NET开发的可以让你在Wind ...

  6. .NET Conf China 2024 AI相关内容解析

    .NET Conf China 2024中国 .NET 开发者峰会即将在上海召开,这次大会是一届完全由社区组织举办的中国.NET 开发者盛会,我们筹备大会之初就定下了大会的主题是"智能.创新 ...

  7. C语言离散化

    C语言离散化 最近看到STL就不想用, 于是写个C语言离散化, 居然能过主席树板子, 就写个博客介绍一下. qsort和bsearch都在<stdlib.h>或<cstdlib> ...

  8. SQL SERVER日常运维巡检系列——数据库备份

    前言 做好日常巡检是数据库管理和维护的重要步骤,而且需要对每次巡检日期.结果进行登记,同时可能需要出一份巡检报告. 本系列旨在解决一些常见的困扰: 不知道巡检哪些东西 不知道怎么样便捷体检 机器太多体 ...

  9. .NET 使用 ZXing.Net 生成二维码,并识别

    .NET 使用 ZXing.Net 生成二维码,并识别 前言 前面已经分享给很多创建二维码,条形码...等一系列的方式 各有优缺点,暂时不做评价.今天推荐ZXing.Net .也是比较全面的一种方式, ...

  10. Oracle.DataAccess.Client.OracleException: 提供程序与此版本的 Oracle 客户机不兼容

    背景:进行程序部署,客户机上原有oracle客户端的版本为2.113.1.0(以下简称113),而数据库.开发机和其他客户机上均采用的2.112.1.0(以下简称112)客户端,所以进行了替换. 卸载 ...