0

0

Oracle 事务特征 管理 读取详解

php中文网

php中文网

发布时间:2016-06-07 17:46:13

|

1212人浏览过

|

来源于php中文网

原创

本文章总结了关于Oracle事务介绍了事务特征 事务管理 事务读三种用法与举实例说明,有需要了解的朋友可以参考一下本文章。

本文章总结了关于Oracle事务介绍了事务特征 事务管理 事务读三种用法与举实例说明,有需要了解的朋友可以参考一下本文章。

Oracle 事务的特征
    ACID,指事务正确执行的四个基本要素的缩写.包含:原子性(Atomicity)、一致性(Consistency)、隔离性(Isolation)、持久性(Durability)。一个支持交易(Transaction)的数据库系统,必需要具有这四种特性,否则在交易过程(Transaction processing)当中无法保证数据的正确性,交易过程极可能达不到交易方的要求. 
原子性 (ATOMICITY)

    整个事务中的所有操作,要么全部完成,要么全部不完成,不可能停滞在中间某个环节。事务在执行过程中发生错误,会被回滚(rollback)到事务开始前的状态,就像这个事务从来没有执行过一样。

一致性 (CONSISTENCY)

   在事务开始之前和事务结束以后,数据库的完整性约束没有被破坏。

隔离性 (ISOLATION)

   两个事务的执行是互不干扰的,一个事务不可能看到其他事务运行时,中间某一时刻的数据。

持久性 (DURABILITY)

在事务完成以后,该事务所对数据库所作的更改便持久的保存在数据库之中,并不会被回滚。


oracle中通常情况下有三种读:

第一种:错读(未提交读),就是读到另一个事物修改过的但没有提交的数据,没有实一致性读。

第二种:不可重复读( 读失真)就是对一个事物前后两次读,读出来的值是不相等的,因为它在这两次读的间隔被别的事物修改或者删除,并且提交了。

第三种读:幻想读 某个事务在两次读之间,有另一事务插入新的数据,并提交,而且插入的数据满足查询的条件,导致读到的数据不一样。

oracle读一致性又分为:

1.语句级读一致性(不可重复读)

2.事务级一致性读

语句性一致性读,比如语句在开始执行之前获得当前的scn号为10001,而另个事务T2可能将该块的行进行修改,设置该行所在块的一致性标记,生成的SCN=10002,这种情况就需要应用undo回滚到scn为10001的时刻,即为一致性状态,在单个语句执行期间这个值是不会改变的。

事务级别一致性读,所有数据的状态是在事务起始的状态,除非本事务修改的数据,这样就可以避免了不可重复读和幻想读。

oracle是通过隔离级来实现事务的一致性读,事务级可以通过回滚段能实现一致性读,虽然别人可能修改了,但是可以利用回滚段,把别人修改的给回滚了。

事务级一致性读就得说道串行读所谓串行读就是你一人在读的话,别人修改不影响你读的结果,可以无视别人的修改。虽然对于数据库是生效了,但是对于串行事务,则被无视。

串行读适合用在下面三种情况:

a.大型数据库中大多是小数据集的DML短事务

 b.修改同一行的几率非常低的系统.

c.长运行事务主要是只读的系统

这块主要是从回滚段来考虑的,应为串行读是通过回滚段来实现的。

设置隔离级命令

 代码如下 复制代码

1.SET TRANSACTION ISOLATION LEVEL READ COMMITTED;(提交度隔离级)
2.SET TRANSACTION ISOLATION LEVEL SERIALIZABLE; (串行读隔离级)
3.SET TRANSACTION ISOLATION LEVEL READ ONLY;(只读隔离级)

 还有一种设置

 代码如下 复制代码

ALTER SESSION
ALTER SESSION SET ISOLATION_LEVEL=SERIALIZABLE;
ALTER SESSION SET ISOLATION_LEVEL=READ COMMITTED

下面来举一个串行隔离的例子,代码如下

 代码如下 复制代码
SQL> create table t ( x int );
Table created
SQL> insert into t values ( 1 );
1 row inserted
SQL> commit;
Commit complete
SQL> set transaction isolation level serializable;
Transaction set
SQL> * from t;
                                      X
---------------------------------------
                                      1
SQL>
SQL> declare
  2    pragma autonomous_transaction;
  3  begin
  4    delete from t;
  5    commit;
  6  end;
  7  /
PL/SQL procedure successfully completed
SQL> select * from t;
 
                                      X
---------------------------------------
                                      1
 SQL> commit;
Commit complete
SQL> select * from t;
                                      X

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

 中间用到的是自制事务,相当于重新启动了一个事务,通过例子可以看出,虽然删除了,但是第一个事务仍然可以看到,这块其实在数据库中已经修改了,只是通过回滚段可以看到,最后一提交,再查看,就会发现真正的删除了。

我们开始试验一,模拟语句级别读一致性。第一个session使用显示打开一个游标模拟数据读,同时在游标读数据的过程中,启动另外一个session更改数据,我可以看到另外一个session对数据的更改,并不会改变到第一个session的读。这就是语句级别的读一致性。

启动一个session连接数据库:
 

 代码如下 复制代码
Connected to Oracle Database 10g Enterprise Edition Release 10.2.0.1.0
Connected as cbo
 
SQL> set serveroutput on;
SQL>
SQL> create table test(id number,name varchar2(10));
 
Table created
SQL> insert into test values(1,'a');
 
1 row inserted
SQL> insert into test values(2,'b');
 
1 row inserted
SQL> commit;
 
Commit complete
 
SQL>
SQL> declare
  2  cursor cur is select * from test;
  3  begin
  4  for rec in cur
  5  loop
  6   dbms_output.put_line(rec.name);
  7   dbms_lock.sleep(10);--中间等待另外一个session启动并执行更新数据操作
  8  end loop;
  9  end;
 10  /
 
a
b
 
PL/SQL procedure successfully completed
 
SQL>

在执行游标打印输出的时候同时启动另外一个进程,执行更新数据操作:

 代码如下 复制代码

Connected to Oracle Database 10g Enterprise Edition Release 10.2.0.1.0
Connected as cbo
 
SQL> set serveroutput on;
SQL>
SQL> create table test(id number,name varchar2(10));
 
Table created
SQL> insert into test values(1,'a');
 
1 row inserted
SQL> insert into test values(2,'b');
 
1 row inserted
SQL> commit;
 
Commit complete
 
SQL>
SQL> declare
  2  cursor cur is select * from test;
  3  begin
  4  for rec in cur
  5  loop
  6   dbms_output.put_line(rec.name);
  7   dbms_lock.sleep(10);
  8  end loop;
  9  end;
 10  /
 
a
b
 
PL/SQL procedure successfully completed
 
SQL>

 

Veed AI Voice Generator
Veed AI Voice Generator

Veed推出的AI语音生成器

下载

下面我们开始试验二,模拟事务级别读一致性。
  首先启动一个SESSION,读一次数据:

 代码如下 复制代码

SQL> SET TRANSACTION READ ONLY;
 
Transaction set
 
SQL> select * from test;
 
        ID NAME
---------- ----------
         1 a
         2 bbbb

 

接下来我们启动另外一个session,执行更新数据操作:

 代码如下 复制代码

SQL> update test set name='123456';
 
2 rows updated
 
SQL> commit;
 
Commit complete

最后我们回到第一session查看再次查看数据:

 代码如下 复制代码

SQL> select * from test;
 
        ID NAME
---------- ----------
         1 a
         2 bbbb

我们会发现读出的数据并没有发生改变。所以在设置了SET TRANSACTION READ ONLY后,一个事务前后语句读取的数据不会因为其他seesion对数据的更新而改变。


Oracle事务管理

一个事务包含一个或多个SQL语句,是逻辑管理的工作单元(原子单元)。
一个事务开始于第一次执行的SQL语句,结束于Commit 或 Rollback 或 DDL语句。
    注意:其中Commit, Rollback是显示的提交事务,而DDL语句是隐式的提交事务的。DDL语句的操作是

没有办法回滚的。
##########################

 代码如下 复制代码

eg:
SQL> create table a ( i int);

表已创建。

SQL> insert into a values(1);

已创建 1 行。

SQL> create table b ( i int);

表已创建。

SQL> rollback;

回退已完成。

SQL> select * from a;

         I                                                                     
----------                                                                     
         1

#############################
在执行create table b 的时候事务就已经提交了。
事务结束的地方有:
  1>. 执行Commit, Rollback, 没有使用savepoint.
  2>. 执行DDL操作如:create , drop, rename, alter
  3>. 断开与Oracle的连接,事务将自动提交。
  4>. 用户进程异常终止,当前事务回滚。
    
  注意:应用程序与Oracle连接的情况,在应用程序终止前必须显示的提交(Commit)或回滚(Rollback)。

Commit操作Oracle做了:
  1>. 与UNDO表空间关联的内部事务表记录该事务已经提交,产生唯一的系统交易号(SCN)保存到该表

中。
  2>. LGWR进程将SGA中的重做日志写入redo log文件,当然也要写SCN到重做日志文件。
  3>. Oracle释放锁定表中的行。
  4>. Oracle设置该事务完成。

  注意:Commit操作前的改变数据(保存在SGA)不会马上写到数据文件中。这样做的目的也是为了数据

库更高效。从开发人员的角度想想也是这样的,这样可以减少很多小事务的多次写磁盘的。

Oracle 10.2中与事务有关的:

 代码如下 复制代码
commit work write immediate wait;          --是Oracle默认的设置。
alter system set commit_write = nowait;     --改变系统提交方式
alter session set commit_write = nowait;   --改变会话提交方式

##############################
提交一个事务 eg:

 代码如下 复制代码
SQL> commit work;

提交完成。

 代码如下 复制代码

SQL> show autocommit;
autocommit OFF
SQL> create table t0(testcol number);

表已创建。

 代码如下 复制代码

SQL> insert into t0 values(1);

已创建 1 行。

SQL> commit;

提交完成。

 代码如下 复制代码

SQL> select * from t0;

   TESTCOL                                                                     
----------                                                                     
         1                                                                     

SQL> insert into t0 values(2);

已创建 1 行。

SQL> commit work;

提交完成。

 代码如下 复制代码

SQL> select * from t0;

   TESTCOL                                                                     
----------                                                                     
         1                                                                     
         2                                                                     

####################################
commit comment eg:

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

通义千问
通义千问

阿里巴巴推出的全能AI助手

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
pixiv网页版官网登录与阅读指南_pixiv官网直达入口与在线访问方法
pixiv网页版官网登录与阅读指南_pixiv官网直达入口与在线访问方法

本专题系统整理pixiv网页版官网入口及登录访问方式,涵盖官网登录页面直达路径、在线阅读入口及快速进入方法说明,帮助用户高效找到pixiv官方网站,实现便捷、安全的网页端浏览与账号登录体验。

616

2026.02.13

微博网页版主页入口与登录指南_官方网页端快速访问方法
微博网页版主页入口与登录指南_官方网页端快速访问方法

本专题系统整理微博网页版官方入口及网页端登录方式,涵盖首页直达地址、账号登录流程与常见访问问题说明,帮助用户快速找到微博官网主页,实现便捷、安全的网页端登录与内容浏览体验。

194

2026.02.13

Flutter跨平台开发与状态管理实战
Flutter跨平台开发与状态管理实战

本专题围绕Flutter框架展开,系统讲解跨平台UI构建原理与状态管理方案。内容涵盖Widget生命周期、路由管理、Provider与Bloc状态管理模式、网络请求封装及性能优化技巧。通过实战项目演示,帮助开发者构建流畅、可维护的跨平台移动应用。

91

2026.02.13

TypeScript工程化开发与Vite构建优化实践
TypeScript工程化开发与Vite构建优化实践

本专题面向前端开发者,深入讲解 TypeScript 类型系统与大型项目结构设计方法,并结合 Vite 构建工具优化前端工程化流程。内容包括模块化设计、类型声明管理、代码分割、热更新原理以及构建性能调优。通过完整项目示例,帮助开发者提升代码可维护性与开发效率。

20

2026.02.13

Redis高可用架构与分布式缓存实战
Redis高可用架构与分布式缓存实战

本专题围绕 Redis 在高并发系统中的应用展开,系统讲解主从复制、哨兵机制、Cluster 集群模式及数据分片原理。内容涵盖缓存穿透与雪崩解决方案、分布式锁实现、热点数据优化及持久化策略。通过真实业务场景演示,帮助开发者构建高可用、可扩展的分布式缓存系统。

54

2026.02.13

c语言 数据类型
c语言 数据类型

本专题整合了c语言数据类型相关内容,阅读专题下面的文章了解更多详细内容。

29

2026.02.12

雨课堂网页版登录入口与使用指南_官方在线教学平台访问方法
雨课堂网页版登录入口与使用指南_官方在线教学平台访问方法

本专题系统整理雨课堂网页版官方入口及在线登录方式,涵盖账号登录流程、官方直连入口及平台访问方法说明,帮助师生用户快速进入雨课堂在线教学平台,实现便捷、高效的课程学习与教学管理体验。

15

2026.02.12

豆包AI网页版入口与智能创作指南_官方在线写作与图片生成使用方法
豆包AI网页版入口与智能创作指南_官方在线写作与图片生成使用方法

本专题汇总豆包AI官方网页版入口及在线使用方式,涵盖智能写作工具、图片生成体验入口和官网登录方法,帮助用户快速直达豆包AI平台,高效完成文本创作与AI生图任务,实现便捷智能创作体验。

598

2026.02.12

PostgreSQL性能优化与索引调优实战
PostgreSQL性能优化与索引调优实战

本专题面向后端开发与数据库工程师,深入讲解 PostgreSQL 查询优化原理与索引机制。内容包括执行计划分析、常见索引类型对比、慢查询优化策略、事务隔离级别以及高并发场景下的性能调优技巧。通过实战案例解析,帮助开发者提升数据库响应速度与系统稳定性。

56

2026.02.12

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
Java 教程
Java 教程

共578课时 | 67.8万人学习

【web前端】Node.js快速入门
【web前端】Node.js快速入门

共16课时 | 2.1万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号