数据库隔离级别深入理解(ORACLE)
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)的更多相关文章
- Mysql加锁过程详解(6)-数据库隔离级别(2)-通过例子理解事务的4种隔离级别
Mysql加锁过程详解(1)-基本知识 Mysql加锁过程详解(2)-关于mysql 幻读理解 Mysql加锁过程详解(3)-关于mysql 幻读理解 Mysql加锁过程详解(4)-select fo ...
- 数据库隔离级别(mysql+Spring)与性能分析
数据库隔离级别与Spring配置事务的联系及性能影响,以下是个人理解,如果有瑕疵请及时指正. 这里以mysql为例,先明确以下几个问题: 一.一般项目如果不自己配置事务的话,一般默认的是au ...
- Mysql加锁过程详解(6)-数据库隔离级别(1)
Mysql加锁过程详解(1)-基本知识 Mysql加锁过程详解(2)-关于mysql 幻读理解 Mysql加锁过程详解(3)-关于mysql 幻读理解 Mysql加锁过程详解(4)-select fo ...
- springmvc 事务控制与数据库隔离级别
springmvc 事物传播与数据库隔离控制 http://www.cnblogs.com/yangy608/archive/2011/06/29/2093478.html 一.Propagation ...
- SQL SERVER 2008 数据库隔离级别代码演示
SQL SERVER 2008 数据库隔离级别代码演示 个隔离级别(其实这是SQL 工业标) 种隔离级别,本身没有优劣之分,完全取决于应用的场景. 本质上,他们是在 隔离性(紊乱程度) 和 灵活性 ...
- Spring事务传播机制和数据库隔离级别
Spring事务传播机制和数据库隔离级别 转载 2010年06月26日 10:52:00 标签: spring / 数据库 / exception / token / transactions / s ...
- ★ MYSQL隔离级别 通俗理解 + mysql、oracle默认事务隔离级别
★ 脏读 : 读取了前一事务 未提交 的数据 ; 不可重复读 : 读取了前一事务 提交 的数据: ★ 幻读 与 不可重复读 common :都是读取了另一条已经提交的事务(这点与脏读不 ...
- Java学习笔记_ 数据库隔离级别和事务传播行为
转自: https://blog.csdn.net/qq_38545713/article/details/79779265 一:数据库的事物隔离级别与传播行为总结: 很多人 ...
- mysql数据库隔离级别
# 原创,转载请留言联系 事务的隔离级别 (由高到低)1.串行化(serializable):一个事务一个事务的执行2.可重复读(Repeatable-Read) 可重复读,无论其他事务是否修改并提交 ...
随机推荐
- python学习之老男孩python全栈第九期_day001作业
1.使用while循环输入 1 2 3 4 5 6 8 9 10 count = 0 while count <= 9: count += 1 if count == 7:continu ...
- 关于input的焦点事件
关于input的焦点事件 $(".scanf_integral").focus(function(){//获取焦点//获取焦点后触发的事件 }) $(".scanf_in ...
- Gitlab--安装及汉化
简介 gitlab是一个利用 Ruby on Rails 开发的开源应用程序,实现一个自托管的Git 项目仓库,可通过Web界面迚行访问公开的戒者私人项目.Ruby on Rails 是一个可以使你开 ...
- logcat use
将已经存在的工程导入到eclipse步骤: ①:首先复制当前工程所在的路径. ②:然后在eclipse,右键->Import->General->Existing Projects ...
- unicode编码和utf8编码的区别
编码格式不同在数据的传输和显示会有很大的影响.最近在使用的过程中发现一些网络文件 传输的编码格式问题,会影响文件的正常传输,于是查看了一下网上的资料,自己也写一篇 小总结. uicode是万国码,用1 ...
- macos 下安装brew
1.终端执行 /usr/bin/ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master ...
- mysql中的utf8mb4、utf8mb4_unicode_ci、utf8mb4_general_ci
1.utf8与utf8mb4(utf8 most bytes 4) MySQL 5.5.3之后增加了utfmb4字符编码 支持BMP(Basic Multilingual Plane,基本多文种平面) ...
- JMeter—定时器(八)
参考<全栈性能测试修炼宝典JMeter实战>第六章 JMeter 元件详解中第三节定时器 JMeter中的定时器一般用来设置延迟与同步.定时器的执行优先级高于取样器,在同一作用域下有多个定 ...
- mysql 临时数据突然变大
晚上收到紧报警,一台数据库服务器磁盘空间使用快速从50%使用率到80%.我们生产的数据库都磁盘是>2T 登录机器发现*.myd文件异常大 登入数据库查询进程 mysql>showproce ...
- 基于python的快速傅里叶变换FFT(二)
基于python的快速傅里叶变换FFT(二)本文在上一篇博客的基础上进一步探究正弦函数及其FFT变换. 知识点 FFT变换,其实就是快速离散傅里叶变换,傅立叶变换是数字信号处理领域一种很重要的算法. ...