当前位置: 首页 > news >正文

Oracle--SQL事务操作与管理流程

  前言:本博客仅作记录学习使用,部分图片出自网络,如有侵犯您的权益,请联系删除

数据库系统的并发控制以事务为单位进行,通过内部锁定机制限制事务对共享资源的访问,确保数据并行性和一致性。事务是由一系列语句构成的逻辑工作单元,与存储过程等批处理相似,通常用于封装业务逻辑,形成独立的工作单元。

一、事务概述

事务处理多个数据表时,若中途出现错误(如系统死机、断电),数据不会保存。事务结果有两种:出错则全部回滚,撤销所有修改;无错则全部提交。因此,合理使用事务能提升数据安全性和处理效率。

1、事务的属性

事务包含4种重要的属性,即原子性、一致性、隔离性和持久性,被统称为ACID。

1.1、原子性(atomicity)

事务是一个整体的工作单元,事务对数据库所做的操作要么全部执行要么全部取消。如果某条语句执行失败,则所有语句全部回滚

1.2、一致性(consistency)

事务完成时需确保所有数据一致。在数据库中,事务修改须遵循所有规则以维护数据完整性。事务成功,数据进入新状态;失败,则回滚至初始状态。

1.3、隔离性(isolation)

事务的修改必须与其他事务的修改隔离。事务查看数据时,只能看到另一并发事务修改前或修改后的状态,不会看到中间状态的数据。这是事务的隔离性要求,确保数据一致性和完整性。

1.4、持久性(durability)

当事务提交后,对数据库所作的修改就会永久保存下来

2、事务的状态

  • 活动状态:正在执行
  • 部分提交状态: 最后一条语句执行完但未完全提交
  • 失败状态: 因硬件或逻辑错误需回滚
  • 提交状态: 成功写入硬盘并完成
  • 终止状态:回滚至初始状态

提交状态和中止状态的事务统称为已决事务,处于活动状态、部分提交状态和失败状态的事务称为未决事务

二、操作事务

在Oracle中,事务隐式自动开始,但结束需要用户操作。事务结束的情况如下:

  • 执行COMMIT语句提交事务
  • 执行ROLLBACK语句撤销事务
  • 执行数据定义语句(如CREATE、DROP、ALTER),成功则自动提交,失败则回滚
  • 执行数据控制命令(如GRANT、REVOKE),完成后自动提交
  • 正常断开数据库连接或退出SQL*Plus环境会自动提交,非正常断开则回滚

综上,Oracle事务的结束需执行COMMIT或ROLLBACK语句

1、设置事务

1.1、设置只读事务

只读事务仅允许查询操作,禁止执行DML操作,可确保用户获取特定时间点的数据。例如,企业需在每日16时统计最近一天的销售信息,使用只读事务后,用户能确保获取16时前的数据,后续其他会话提交的新数据不会影响该事务的查询结果。

当设置只读事务时,“set transaction read only;”语句必须是事务开始的第一条语句。

使用过程READ ONLY也可以设置只读事务,设置只读事务有如下两种语句:

 --第一种语句set transaction read only;--第二种语句exec dbms_transaction.read_only;
1.2、设置读写事务

设置事务为读写事务,是事务的默认方式,将建立回滚信息。将事务设置为读写状态的代码:

 set transaction read write
1.3、为事务分配回滚段

在Oracle中,用户可自定义回滚段权限以灵活调整性能。分配原则为:

  • 短时查询且不涉及相同数据表的事务,分配小回滚段以节省内存;
  • 长时间查询且需读取相同数据表的事务,分配大回滚段避免频繁改写回滚信息;
  • 涉及大量数据插入、删除或更新的事务,分配足够大的回滚段以保存事务的回滚信息。

相关代码如下:

 set transaction use rollback segment system

2、提交事务(COMMIT语句)

提交事务是指把对数据库进行的全部操作持久性地保存到数据库中,这种操作通常使用COMMIT语句来完成

2.1、提交前的SGA的状态

事务提交前,Oracle SQL语句执行后的SGA内存状态如下:

  • 回滚缓冲区:生成回滚记录,包含所有已修改值的旧值,用于事务回滚时恢复数据。
  • 日志缓冲区:生成该事务的日志,日志在事务提交前已被写入物理磁盘,确保事务的持久性。
  • 数据库缓冲区:数据被修改,但这些修改在事务提交后才会写入物理磁盘,确保数据一致性。
2.2、提交工作

当使用COMMIT语句提交事务时,Oracle系统内部会按以下顺序处理:

  • 在回滚段内记录当前事务已提交,并生成一个唯一的系统编号(SCN)来标识该事务。
  • 启动后台的日志写入进程(LGWR),将重做日志缓冲区中的事务重做日志信息和事务SCN写入磁盘上的重做日志文件中。
  • Oracle服务器开始释放事务处理所使用的系统资源。
  • 显示通知,告知用户事务已成功提交完毕。
2.3、提交的方式

事务的提交方式主要有以下三种:

  1. 显式提交:使用COMMIT命令使当前事务生效。

  2. 自动提交:在SQL*Plus中执行SET AUTOCOMMIT ON命令,这样每执行一条DML语句就自动提交一次事务。(虽然这种方式在进行DML操作时看似方便,但在实际应用中可能会出现问题。例如,当应用程序需要同时对多张通过外键关联的表进行DML操作时,由于外键约束要求维护引用完整性,操作顺序可能受到限制,这会增加应用程序开发的复杂性和对程序开发人员水平的要求。因此,在Oracle数据库管理系统中,默认设置AUTOCOMMIT为OFF)

  3. 隐式提交:除了显式提交之外的提交方式,例如发出DDL命令、程序中止和关闭数据库等操作,这些操作会导致事务隐式提交。

3、回滚事务

回滚事务是指撤销对数据库进行的全部操作,Oracle系统内部会执行以下操作:

  • 使用回退段中的数据撤销对数据库所做的修改。
  • Oracle后台服务进程释放事务所使用的系统资源。
  • 显示通知,告知用户事务回退成功。
 --示例:在emp表中,首先删除员工编号是7902的记录,然后回滚事务,恢复数据--首先查询该记录select * from emp where empno=7902;​--删除该记录delete from emp where empno=7902;​--查询emp数据表中是否还存在员工编号为7902的记录select * from emp where empno=7902;​--回滚事务rollback;​--再次查询可查询到有记录了,删除的数据恢复

事务的回滚可以撤销未提交事务中SQL命令对数据所做的修改

4、设置回退点

回退点(保存点)是在事务中间设定的回滚标记,作用类似于调试程序的中断点。它将事务划分为若干小部分,以便回滚到指定保存点,而不是整个事务,从而提供更大的灵活性。回滚到指定保存点主要完成以下工作:

  • 回滚保存点之后的部分事务。
  • 删除该保存点之后建立的所有保存点,但保留该保存点以便多次回滚。
  • 解除保存点之后对表或行的封锁。
 --示例:select * from dept_temp;savepoint sp01;             --建立保存点sp01insert into dept_temp values(50,'IT部','上海');    --添加记录savepoint sp02;             --建立保存点sp02delete dept_temp where deptno = 10;     --删除数据select * from dept_temp;​rollback to sp02;       --回滚到sp02并查询数据select * from dept_temp;​rollback to sp01;       --回滚到sp01并查询数据select * from dept_temp;

通过查询结果,可以发现当事务回滚到保存点sp02时,在保存点sp02后所做的操作被撤销

上面介绍的使用ROLLBACK命令回滚事务的方式称为显式回滚还有一种回滚方式称为隐式回滚。如果系统在事务执行期间发生错误、死锁和中止等情况,系统将自动完成隐式回滚

学习永无止境,让我们共同进步!! 

相关文章:

  • Vue2-样式相关
  • 【高并发内存池】从零到一的项目之高并发内存池整体框架设计及thread cache设计
  • 基于TCP的协议
  • 深度学习--卷积神经网络保存最优模型
  • mcp 客户端sse远程调用服务端与本地大模型集成实例
  • Python 基础
  • ABAQUS多晶体材料断裂模型
  • 百度搜索 API 相比于爬虫的效率提升、价格及如何注册使用
  • Kubernetes Docker 部署达梦8数据库
  • 【EasyPan】文件上传、文件秒传、文件转码、文件合并、异步转码、视频切割分析
  • MySQL索引知识点(笔记)
  • 《大模型+Agent 企业应用实践》的大纲
  • 网络基础概念(下)
  • 驱动开发硬核特训 · Day 17:深入掌握中断机制与驱动开发中的应用实战
  • MYSQL的binlog
  • 《棒球规则》全明星比赛规则·棒球1号位
  • 爱普生FC1610BN晶体在健康监测手环的应用
  • 使用Python设置excel单元格的字体(font值)
  • JavaScript 扩展Array类方法实现数组求和
  • 【网络应用程序设计】实验一:本地机上的聊天室
  • 广州远洋宾馆负一层配电房发生火情:明火已扑灭,无人员伤亡
  • 庆祝中国印尼建交75周年招待会暨万隆会议70周年纪念活动在京举行
  • 2025中国互联网企业家座谈会在京召开
  • 德国男中音马蒂亚斯·格内:古典音乐的未来在亚洲
  • 体坛联播|巴萨三球逆转塞尔塔,CBA季后赛山西横扫广东
  • 跑马,一场对机器人的长测试