Oracle事务的隔离级别有2总, Read Commitment, Serializable, Read Only (另外还有2种事务隔离级别,Read Uncommitted, Repatable Read,Oracle没有单独提供.)
Read Only, 看名字就比较简单,在此我们不做讨论,下面主要分析一下Read Commitment, Serializable.
一句话描述:
Read Commitment: 读取在语句开始时已经提交的, 修改冲突通过写一致性来解决数据的一致性.
Serializable: 读取在事务开始时已经提交的. 修改冲突确保先提交的成功,后修改的回滚.
比较细节
不同点
|
读一致性 |
写冲突 |
Read Commitment |
如果事务进行过程中,有数据在别的事务里面提交了,可以立即被当前事务读取到. |
先修改的可以正常提交,后修改的必须等到先修改提交之后.然后通过写一致性来重启事务 |
Serializable: |
事务开始后,其他事务的所有修改对当前事务没有任何影响 |
后修改数据的事务同样会被阻塞,但是当阻塞解除提交时会出现ORA-08177异常. (ORA-08177: can't serialize access for this transaction) |
相同点
|
读一致性 |
写冲突 |
Read Commitment |
只有提交后的数据才会被读取,都不会读取脏数据. |
后修改数据的事务都会被阻塞,无法提交. |
Serializable: |
实验过程
下面的2个实验,比较了Oracle所支持的事务隔离模式, 在读取和修改数据时的详细区别. 如何切换数据库的隔离模式,可以参考下面的语句.
ALTER SESSION SET ISOLATION_LEVEL = READ COMMITTED;
ALTER SESSION SET ISOLATION_LEVEL = serializable;
下面的2个实验,在开始前需要使用上面的初始化脚本Reset数据.
DROP TABLE XXRPTH.TEST;
CREATE TABLE XXRPTH.TEST
(
NAME VARCHAR(10),
VALUE NUMBER(22)
);
insert into test values('lilao_1', 1);
insert into test values('lilao_2', 2);
insert into test values('lilao_3', 3);
commit;
关键比较点,已经标红高亮
时间 |
事务1 |
事务2 |
Read Commitment |
Serializable: |
t1 |
savepoint aaa; |
|
显示开启事务1 |
|
t2 |
|
savepoint bbb; |
|
显示开启事务2 |
t3 |
|
update test set value=value+10 ; |
|
|
t4 |
select count(*) from test where value>10; |
|
结果是0(读可提交) |
结果是0 |
t5 |
|
commit; |
|
|
t6 |
select count(*) from test where value>10; |
|
结果是3(幻象读,和t4时间读取的记录条数不一样了) |
结果是0 |
t7 |
commit; |
|
|
|
t8 |
select * from test; |
|
NAME VALUE ---------- ---------- lilao_1 11 lilao_2 12 lilao_3 13 |
NAME VALUE ---------- ---------- lilao_1 11 lilao_2 12 lilao_3 13 |
时间 |
事务1 |
事务2 |
Read Commitment |
Serializable: |
t1 |
savepoint aaa; |
|
显示开启事务1 |
|
t2 |
|
savepoint bbb; |
|
显示开启事务2 |
t3 |
|
update test set value=value+10 ; |
|
|
t4 |
select count(*) from test where value>10; |
|
结果是0(读可提交) |
结果是0 |
t5 |
update test set value=value+100; |
|
|
|
t6 |
|
commit; |
|
事务2提交时,事务1会抛出异常 ORA-08177: can't serialize access for this transaction
|
t7 |
select * from test; |
|
NAME VALUE ---------- ---------- lilao_1 111 lilao_2 112 lilao_3 113 |
NAME VALUE ---------- ---------- lilao_1 1 lilao_2 2 lilao_3 3 |
t8 |
commit; |
|
|
虽然事务1在T6时,抛出异常,但是事务并未终止. 所以T7时间没有查询到事务2的修改
|
t9 |
select * from test; |
|
NAME VALUE ---------- ---------- lilao_1 111 lilao_2 112 lilao_3 113 |
NAME VALUE ---------- ---------- lilao_1 11 lilao_2 12 lilao_3 13 |
分享到:
相关推荐
本书《更多Windows白话经典算法之七大排序第2版》是一部深入浅出讲解七种经典排序算法的著作,旨在帮助读者理解并掌握冒泡排序、直接插入排序、直接选择排序、希尔排序、归并排序、快速排序以及堆排序等基本概念和...
【标题】:“06 白话容器基础(二):隔离与限制.pdf” 【描述】:“06 白话容器基础(二):隔离与限制.pdf”这篇文章深入探讨了容器技术中的核心概念——隔离与限制,主要围绕Linux容器的Namespace技术以及它与...
Oracle Instant Client是一款由Oracle公司提供的轻量级数据库连接客户端,主要功能是允许应用程序在无需完整Oracle数据库服务器的情况下,与Oracle数据库进行通信。这个版本——"instantclient-basic-windows.x64-...
子平真诠白话解释 子平真诠白话解释是对《子平真诠》书中语言的白话形式记录。《子平真诠》书中语言虽接近现在,但也有不少生涩的地方;因此,需要将其语义以现在白话形式记录下来,方便自己日后翻看。 子平真诠...
白话中台战略-中台是个什么鬼.pdf白话中台战略-中台是个什么鬼.pdf白话中台战略-中台是个什么鬼.pdf白话中台战略-中台是个什么鬼.pdf白话中台战略-中台是个什么鬼.pdf白话中台战略-中台是个什么鬼.pdf白话中台战略-...
《白话C++》是一本深受读者喜爱的编程著作,由中国的编程大师撰写,旨在以通俗易懂的方式解析复杂的C++编程语言。作者通过简洁幽默的语言,使得这本教程不仅适合初学者,也对有一定经验的程序员有很高的参考价值。在...
白话机器学习的数学-立石贤吾-源代码.zip
《罗织经》白话全译.doc
白话机器学习的数学 机器学习是一种人工智能的方法论,通过让计算机自主学习数据中的规律和模式,从而完成特定的任务。机器学习有监督学习和无监督学习两种类型。在监督学习中,我们向模型提供带有标签的训练数据,...
【容器技术的基础与隔离原理】 在现代IT领域,容器技术,特别是Docker,已经成为应用程序部署和管理的关键工具。本文将深入探讨容器的核心概念——隔离与限制,以及它们如何与虚拟机进行对比。 容器的隔离主要依赖...
1. **Oracle Instant Client**:这是Oracle公司提供的一种小型、快速的数据库连接工具,它允许应用程序无需完整安装Oracle数据库服务器就能连接到远程Oracle数据库。它包含必要的动态链接库(DLLs)和其他文件,可以...
《白话 Windows 编程》EXE格式电子书,收藏版!!!
2. **控制结构**:C++中的控制结构主要包括条件语句(if-else)、循环(for、while、do-while)和选择结构(switch-case)。这些是编写逻辑代码的核心部分。 3. **函数**:函数是C++中组织代码的基本单元,用于封装...
白话文运动的危机,CAJViewer 文件,使用CAJViewer软件查看
在IT领域,C++是一种强大的、通用的编程语言,它以其高效性、灵活性和面向对象的特性而闻名。"白话C++编程"这个资源显然旨在以通俗易懂的方式介绍C++编程的基础知识,这对于初学者或者需要巩固基础的开发者来说是...
白话 C++ 第二学堂 适合入门级C++的学习,比较全的C++细节知识
《白话C++编程》是一本面向初学者和进阶者的C++编程教程,旨在用通俗易懂的语言讲解复杂的C++概念。C++是一种强大的、通用的编程语言,被广泛应用于系统软件、游戏开发、应用软件以及高性能计算等多个领域。本书以...
在Windows编程中,C++是一种常用的语言,因为它提供了对底层硬件的直接访问,同时又能利用面向对象编程的优势。Windows API(应用程序接口)是开发者与操作系统交互的主要方式,它提供了一系列函数和结构,用于创建...
### 白话经典算法之七大排序 #### 一、冒泡排序 冒泡排序是一种简单直观的排序算法,它的基本思想是从第一个元素开始,比较相邻元素的大小,如果前一个元素大于后一个元素则交换它们的位置,这样一轮比较下来,...