TRANSACTION_READ_UNCOMMITTED 1

  这种隔离级别最低,脏读,不可重复读,幻读都会发生,我用的oracle,并没有支持这个级别,不作研究。

  TRANSACTION_READ_COMMITTED  2 

  This is the default transaction isolation level. Each query executed by a transaction sees only data that was committed before the query (not the transaction) began. An Oracle query never reads dirty (uncommitted) data.

  Because Oracle does not prevent other transactions from modifying the data read by a query, that data can be changed by other transactions between two executions of the query. Thus, a transaction that runs a given query twice can experience both nonrepeatable read and phantoms.

  可以避免脏读,当前connection读到的都是其他connection已经commit的数据。orcale的默认级别。

  TRANSACTION_REPEATABLE_READ 4

  这是避免不可重复读的隔离策略,oracle也不支持这个,我们可以用sql语句select..... for update 来理解,就是查询操作都要把你要查询的行加锁。这样别人就不能改了,这样也就不会发生不可重复读了。

  我做了个实验用一个connection读一个字段,然后将线程等待5秒,然后再读同样的东西,在等待5秒过程中,用另一个线程去update并提交了这个字段,结果第一个线程读取得到的两个值一个是改之前的一个是改之后的,我把conn的隔离级别设成4,就报oracle不支持的错了。所以可想而知如果oracle支持,那么这两次读取应该是一致的。

  TRANSACTION_SERIALIZABLE 8

  最高的级别,所有问题都不会发生。我用的oracle11,做实验发现开了这个隔离级别后,是能保证不发生幻读了,我用一个线程前后读两次表进行全表查询,另一个线程在中间插入一条记录,第一个线程前后两次结果都一致,然后不开这个隔离级别,后面的结果就变了,说明确实幻读是解决了。但我以为是要将表全部锁住来不让幻读发生,结果却是又能插入新的数据(之后又测试了下删除和修改操作都是可以的,不会被锁),而两次查询前后又都一致,oracle是如何实现的呢:

  Serializable transactions see only those changes that were committed at the time the transaction began, plus those changes made by the transaction itself through INSERT , UPDATE , and DELETE statements. Serializable transactions do not experience nonrepeatable reads or phantoms.

  官方的说法是只能查看到在事务开始之前所有被提交的数据,以及自身修改的数据,所有不会发生所有并发产生的读问题。要具体知道里面是怎么实现,还得深入学习oralce的运行原理,有好多知识点比如,undo,redo,sga,日志,scn,LGWR等,现在先知道是什么,以后有时间了静下来好好学习下Oracle,在弄明白How。

读一致性实现原理

  查询语句进入执行状态时,ORACLE会为它分配一个当前的SCN。该查询语句在数据缓冲区中搜索所需的数据块时,只会读取SCN小于或等于该SCN的数据块。如果所需的数据块的SCN大于该SCN,则该查询语句就会从撤销段中获得对应的数据块的原始版本,并且该版本的SCN同样需要小于或等于该SCN,这样通过对数据块SCN的比较,该查询语句就只会返回在它开始之前就语句提交的数据。保证了不会读取到未提交事务所产生的脏数据块,也不会读取到该查询语句开始执行之后才提交的数据块。

  

----------------

不知道其他数据库如何,oralce支持的这两种隔离级别都是个写锁,在update但未commit的时候,都是把你要操作的那些数据是锁了的,其他人这个时候是不能写这些数据的。也许这和隔离级别没关系了,因为隔离级别正确的理解是从自己出发,我自己能看到什么,而不是关心别人怎么看到我写的。这样想思路就不会绞了。

数据库隔离级别深入理解(ORACLE)的更多相关文章

  1. Mysql加锁过程详解(6)-数据库隔离级别(2)-通过例子理解事务的4种隔离级别

    Mysql加锁过程详解(1)-基本知识 Mysql加锁过程详解(2)-关于mysql 幻读理解 Mysql加锁过程详解(3)-关于mysql 幻读理解 Mysql加锁过程详解(4)-select fo ...

  2. 数据库隔离级别(mysql+Spring)与性能分析

     数据库隔离级别与Spring配置事务的联系及性能影响,以下是个人理解,如果有瑕疵请及时指正.   这里以mysql为例,先明确以下几个问题: 一.一般项目如果不自己配置事务的话,一般默认的是au ...

  3. Mysql加锁过程详解(6)-数据库隔离级别(1)

    Mysql加锁过程详解(1)-基本知识 Mysql加锁过程详解(2)-关于mysql 幻读理解 Mysql加锁过程详解(3)-关于mysql 幻读理解 Mysql加锁过程详解(4)-select fo ...

  4. springmvc 事务控制与数据库隔离级别

    springmvc 事物传播与数据库隔离控制 http://www.cnblogs.com/yangy608/archive/2011/06/29/2093478.html 一.Propagation ...

  5. SQL SERVER 2008 数据库隔离级别代码演示

    SQL SERVER 2008 数据库隔离级别代码演示   个隔离级别(其实这是SQL 工业标) 种隔离级别,本身没有优劣之分,完全取决于应用的场景. 本质上,他们是在 隔离性(紊乱程度) 和 灵活性 ...

  6. Spring事务传播机制和数据库隔离级别

    Spring事务传播机制和数据库隔离级别 转载 2010年06月26日 10:52:00 标签: spring / 数据库 / exception / token / transactions / s ...

  7. ★ MYSQL隔离级别 通俗理解 + mysql、oracle默认事务隔离级别

    ★  脏读 : 读取了前一事务 未提交 的数据 ; 不可重复读    : 读取了前一事务     提交 的数据: ★ 幻读 与 不可重复读 common :都是读取了另一条已经提交的事务(这点与脏读不 ...

  8. Java学习笔记_ 数据库隔离级别和事务传播行为

    转自: https://blog.csdn.net/qq_38545713/article/details/79779265 一:数据库的事物隔离级别与传播行为总结:              很多人 ...

  9. mysql数据库隔离级别

    # 原创,转载请留言联系 事务的隔离级别 (由高到低)1.串行化(serializable):一个事务一个事务的执行2.可重复读(Repeatable-Read) 可重复读,无论其他事务是否修改并提交 ...

随机推荐

  1. 解决element-ui的el-select组件文字超过宽度时不出现横向滚动条问题

    我用的element-ui是V1.4.3. 目前遇到一个问题,在用el-select组件的时候,当选项的内容很长的时候,会撑开下拉菜单的宽度,这样影响美观.具体如下图所示: 解决这个问题的思路:设置下 ...

  2. vue-cli脚手架之webpack.test.conf.js

    webpack单元测试配置: // This is the webpack config used for unit tests. var utils = require('./utils')//ut ...

  3. java Name [jdbc/myjavadb] is not bound in this Context. Unable to find [jdbc].

    一.出错时的情况: 首先,这是一个servlet项目 1.项目的web.xml配置了:(后来发现不配置这个也行,但是tomcat一定要配置) <resource-ref> <desc ...

  4. Java网络编程--InetAdress类

    一.地址 java.net包中的InetAddress 类对象含有一个Internet主机地址的域名和Ip地址 www.sina.com.cn/202.108.35.210 二.获取地址 1.获取In ...

  5. (网页)jQuery的时间datetime控件在AngularJs中使用实例

    百度一下,自己也想了一下,有一种简单,无脑的方式分享给你: <input ng-model="start" id="start" placeholder= ...

  6. [Android GMS 认证] keystore/keymaster/Attestation的问题

    首先确定写入key,操作如下: 检查 /persist/data/sfs 目录下是否有key文件存在     adb shell ls -la /persist/data/sfs 做过key prov ...

  7. mysql快速生成truncate脚本清空数据库表记录

    语句格式: select CONCAT('truncate TABLE ',table_schema,'.',TABLE_NAME, ';') from INFORMATION_SCHEMA.TABL ...

  8. JQuery实战中遇到的两个小问题$(document).ready() 、bind函数的参数传递问题

    一.$(document).ready() 与 window.onload的区别 1.执行时间 window.onload 必须等到页面内所有元素(包括图片 css js等)加载完毕后才会执行. $( ...

  9. iframe在iphone中滚动条无效

    在iphone(ios11)中(其他苹果设备未尝试),不论是在微信的浏览器中,还是在其他浏览器中,iframe的滚动条怎么设置都没有效果,页面内容都无法进行滚动; 解决方法: 将iframe包裹在di ...

  10. Python面试题(一)【转】

    注:本面试题来源于网络,转载自http://www.cnblogs.com/goodhacker/p/3366618.html. 1. (1)python下多线程的限制以及多进程中传递参数的方式 py ...