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、提交的方式
事务的提交方式主要有以下三种:
-
显式提交:使用COMMIT命令使当前事务生效。
-
自动提交:在SQL*Plus中执行SET AUTOCOMMIT ON命令,这样每执行一条DML语句就自动提交一次事务。(虽然这种方式在进行DML操作时看似方便,但在实际应用中可能会出现问题。例如,当应用程序需要同时对多张通过外键关联的表进行DML操作时,由于外键约束要求维护引用完整性,操作顺序可能受到限制,这会增加应用程序开发的复杂性和对程序开发人员水平的要求。因此,在Oracle数据库管理系统中,默认设置AUTOCOMMIT为OFF)
-
隐式提交:除了显式提交之外的提交方式,例如发出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命令回滚事务的方式称为显式回滚 。还有一种回滚方式称为隐式回滚。如果系统在事务执行期间发生错误、死锁和中止等情况,系统将自动完成隐式回滚
学习永无止境,让我们共同进步!!