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也可以设置只读事务,设置只读事务有如下两种语句:

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

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

sql 复制代码
 set transaction read write
1.3、为事务分配回滚段

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

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

相关代码如下:

sql 复制代码
 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后台服务进程释放事务所使用的系统资源。
  • 显示通知,告知用户事务回退成功。
sql 复制代码
 --示例:在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、设置回退点

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

  • 回滚保存点之后的部分事务。
  • 删除该保存点之后建立的所有保存点,但保留该保存点以便多次回滚。
  • 解除保存点之后对表或行的封锁。
sql 复制代码
 --示例:
 select * from dept_temp;
 savepoint sp01;             --建立保存点sp01
 insert into dept_temp values(50,'IT部','上海');    --添加记录
 savepoint sp02;             --建立保存点sp02
 delete 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命令回滚事务的方式称为显式回滚还有一种回滚方式称为隐式回滚。如果系统在事务执行期间发生错误、死锁和中止等情况,系统将自动完成隐式回滚

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

相关推荐
api_1800790546011 小时前
异步数据采集实践:用 Python/Node.js 构建高并发淘宝商品 API 调用引擎
大数据·开发语言·数据库·数据挖掘·node.js
怕什么真理无穷12 小时前
mysql server 9.4 windows安装教程(sqlyog 下载)
数据库
Olrookie12 小时前
MySQL运维常用SQL
运维·数据库·sql·mysql·dba
数据库生产实战12 小时前
ORACLE 19C ADG环境 如何快速删除1.8TB的分区表?有哪些注意事项?
数据库·oracle
blackorbird12 小时前
使用 Overpass Turbo 查找监控摄像头
运维·服务器·数据库·windows
IT永勇12 小时前
SQLite数据库基本操作
数据库·sqlite·嵌入式开发·增删改查·关系型数据库
洋不写bug12 小时前
数据库的创建,查看,修改,删除,字符集编码和校验操作
android·数据库·adb
想ai抽12 小时前
吃透大数据算法-算法地图(备用)
大数据·数据库·spark
weixin_3077791312 小时前
Clickhouse导出库的表、视图、用户和角色定义的SQL语句
开发语言·数据库·算法·clickhouse·自动化
流星白龙13 小时前
【Qt】7.信号和槽_connect函数用法(1)
开发语言·数据库·qt