Oracle && OceanBase 相关文档,希望互相学习,
共同进步
1.背景
上篇 《++【Oracle专栏】跨服务器调用ORA-02064: 不支持分布式操作++》中测试了自治事务的使用。
本文主要是对oracle 自治事务 autonomous transaction ,AT 进行详细的总结。

2. 实验
2.1 实验:新建两个过程,正常调用
新建两个过程:proc_add2 (最后提交)调用 proc_add1(回滚),测试:
create or replace procedure proc_add1
is
begin
INSERT INTO EW_DAYEND_LOG
(LOGID, FUNCTION_NAME, TABLE_NAME, DATA_ISSUE, LOG_TIME, LOG_TYPE, MESSAGE)
VALUES
(SYS_GUID(),'day_end_test' ,'log' , '2026-01',SYSDATE, '0','调用测试_1');
rollback;
end;
/
create or replace procedure proc_add2
is
begin
INSERT INTO EW_DAYEND_LOG
(LOGID, FUNCTION_NAME, TABLE_NAME, DATA_ISSUE, LOG_TIME, LOG_TYPE, MESSAGE)
VALUES
(SYS_GUID(),'day_end_test' ,'log' , '2026-02',SYSDATE, '0','调用测试_2');
proc_add1(); -- 调用过程proc_useradd1
commit;
end;
/
truncate table EW_DAYEND_LOG;
begin
proc_add2;
end;
执行 proc_add2, 表中没有数据。
因为先插"调用测试2",但是没有提交,然后调用proc_add1,此时插入"调用测试1",里面有rollback, 然后一起回滚。最后commit时,两条数据都已回滚,因此没有记录。

2.2 实验:子过程 自治事务,测试
修改proc_add1 被调用代码,改为自治 pragma autonomous_transaction; 再次调用测试:
create or replace procedure proc_add1
is pragma autonomous_transaction;
begin
INSERT INTO EW_DAYEND_LOG
(LOGID, FUNCTION_NAME, TABLE_NAME, DATA_ISSUE, LOG_TIME, LOG_TYPE, MESSAGE)
VALUES
(SYS_GUID(),'day_end_test' ,'log' , '2026-01',SYSDATE, '0','调用测试_1');
rollback;
end;
测试结果:此时有"调用测试2"的一条数据。
rollback 只在"调用测试1"时生效,不影响测试2的提交。

说明:pragma autonomous_transaction; --自治事务的标识
(1) pragma 关键字:通知 PL/SQL 编译器,将声明它的这个 PL/SQL 代码块分割为一个自治的或独立的事务。
(2)定义自治事务时,要遵守以下几条规则:
如果 PL/SQL 块是匿名的,那么该匿名 PL/SQL 块必须是一个顶层块。
如果 PL/SQL 块不是匿名的,那么它必须作为包或存储过程序单元一部分的一个过程或函数。当在包中定义自治事务时,只有包中具体的函数或过程才能被指定为自治的的。
PL/SQL 块也可以是存储对象类型的一个方法
PL/SQL 块也可以是一个数据库触发器
2.3 实验:测试自治事务无commit
proc_add1 增加自治事务处理,且去掉rollback 或commit
proc_add2 最后的commit 改为rollback
create or replace procedure proc_add1
is pragma autonomous_transaction;
begin
INSERT INTO EW_DAYEND_LOG
(LOGID, FUNCTION_NAME, TABLE_NAME, DATA_ISSUE, LOG_TIME, LOG_TYPE, MESSAGE)
VALUES
(SYS_GUID(),'day_end_test' ,'log' , '2026-01',SYSDATE, '0','调用测试_1');
--rollback;
end;
/
create or replace procedure proc_add2
is
begin
INSERT INTO EW_DAYEND_LOG
(LOGID, FUNCTION_NAME, TABLE_NAME, DATA_ISSUE, LOG_TIME, LOG_TYPE, MESSAGE)
VALUES
(SYS_GUID(),'day_end_test' ,'log' , '2026-02',SYSDATE, '0','调用测试_2');
proc_add1(); -- 调用过程proc_useradd1
rollback;
end;
/
此时报错:ORA-06519: 检测到活动的独立的事务处理,已经回退

说明:自治事务是以 commit 或 rollback 语句结束的。因此,应该在自治事务程序的内部显式地包含一个 commit 或 rollback 语句。如果没有这样做,任何一个未确定的事务都会回滚。这是一个事务级的回滚,而不是一个语句级的回滚。
独立事务必须显式结束,否则会引发ORA-06519错误
处理:将proc_add1 增加commit;事务提交,再次测试:测试结果只有"调用测试1" 一条数据。
create or replace procedure proc_add1
is pragma autonomous_transaction;
begin
INSERT INTO EW_DAYEND_LOG
(LOGID, FUNCTION_NAME, TABLE_NAME, DATA_ISSUE, LOG_TIME, LOG_TYPE, MESSAGE)
VALUES
(SYS_GUID(),'day_end_test' ,'log' , '2026-01',SYSDATE, '0','调用测试_1');
commit;
--rollback;
end;
/
create or replace procedure proc_add2
is
begin
INSERT INTO EW_DAYEND_LOG
(LOGID, FUNCTION_NAME, TABLE_NAME, DATA_ISSUE, LOG_TIME, LOG_TYPE, MESSAGE)
VALUES
(SYS_GUID(),'day_end_test' ,'log' , '2026-02',SYSDATE, '0','调用测试_2');
proc_add1(); -- 调用过程proc_useradd1
rollback;
end;
/
3.oracle自治事务总结 🚩
3.1 自治事务的定义
在复杂的数据库应用环境中,事务管理常面临一大难题:如何在保证主事务逻辑连续性的同时,执行那些需要独立控制的事务操作,如日志记录、错误处理和异步通知等。这些操作若与主事务绑定,可能会增加处理的复杂性。
自治事务由此应运而生,它提供了在主事务外独立进行事务处理的能力,成为解决这一难题的关键。
自治事务(Autonomous Transactions)是Oracle原生支持的一种特殊事务类型,指在PL/SQL中可以启动一个与主事务隔离的事务,这个事务可以提交(COMMIT)或回滚(ROLLBACK)而不影响主事务。该功能可以在PL/pgSQL的函数(Function)或存储过程(Stored Procedure)中应用,使得当前存储过程中的事务可以独立提交,而不会影响到外部事务。通常用于需要独立于主事务执行数据库操作的场景,比如发送日志信息到数据库表而不影响主事务的完整性。
Oracle独立事务(Autonomous Transaction)是一种与主事务隔离的特殊事务机制,通过
PRAGMA AUTONOMOUS_TRANSACTION声明实现。它是一个PL/SQL编程特性,允许在PL/SQL程序中创建独立的、自动提交的事务。其核心特性:执行时主事务会被挂起,独立事务的提交或回滚不会影响主事务状态。因此对于需要执行多个操作但又不想因为其中一个操作失败而影响整个程序执行的情况非常有用。通过
PRAGMA AUTONOMOUS_TRANSACTION编译器指令声明独立事务块,必须显式提交或回滚
3.2 自治事务的工作原理

- 创建上下文:在PL/SQL代码中,创建一个匿名块或一个函数/过程,并在其中启动一个自主事务。
- 隔离性:自主事务在其自己的环境中运行,不受外部事务的影响。即它可以访问数据库,执行操作,并且这些操作不会影响原始事务的状态。
- 提交与回滚:自主事务可以独立于外部事务进行提交或回滚。
**独立性机制:**独立事务在执行期间会创建独立的事务上下文,与主事务完全隔离。体现在:
- 数据隔离:无法访问主事务未提交的临时表或行级数据
- 锁隔离:不共享主事务的锁资源,避免死锁风险
- 结果隔离:提交结果对主事务可见,但主事务回滚不影响已提交的独立事务
3.3 自治事务核心逻辑
- 自治事务编译时,会在func中打上自治事务标记
- 当自治事务函数被调用时,会在主线程的函数执行阶段启动自治事务线程
- 从主线程传递自治事务函数执行所需要的参数和数据
- 自治事务线程通过执行算子来执行自治事务函数
- 自治事务函数执行后返回结果到主线程
3.4 自治事务的优势
- 简化开发:减少了代码复杂度,特别是在执行多个独立操作时。
- 提高性能:减少了事务管理的开销,特别是在高并发环境中。
- 易于维护:代码更清晰、更易于维护,因为事务的管理被抽象化了。
3.5 自治事务注意事项
- 错误处理 :在使用自治事务时,确保适当地处理异常和错误。例如,可以使用
EXCEPTION块来捕获和处理可能发生的错误。 - 性能影响:尽管自治事务可以提高性能,但在某些情况下(如大量数据操作),仍需评估其对性能的具体影响。
4.其他知识点
package(包)是将逻辑上相关的PL/SQL存储过程、函数、类型、变量、游标等封装在一起的单元,。
隔离等级是一种处理修改数据库事务的方法,它影响到一个事务中的改变对另一个事务的可见性。
SQL92 中定义了 4 种隔离级别即:
READ UNCOMMITTED
REPEATABLE READ
READ COMMOTTED
SERIALIZABLE
oracle 支持 READ COMMOTTED 和 SERIALIZABLE 两种隔离级别:
Read committed :是 oracle 默认的 , 即可以看到查询之前提交的数据。
换句话说,这种模式的事务是基于每句一致的事务集的。
Serializable : 这种设置意味着一个事务中的所有语句,都在操作一个事务开始时的数据库映像中,这意味着没有 commit 之前,当前事务都不能看到其它事务所提交的数据。
实验验证:ok 
项目管理--相关知识 
项目管理-项目绩效域1/2_八大绩效域和十大管理有什么联系-CSDN博客
项目管理-计算题公式【复习】_项目管理进度计算题公式:乐观-CSDN博客
项目管理-相关知识(组织通用治理、组织通用管理、法律法规与标准规范)-CSDN博客
Oracle其他文档,希望互相学习,
共同进步
Oracle-找回误删的表数据(LogMiner 挖掘日志)_oracle日志挖掘恢复数据-CSDN博客
oracle 跟踪文件--审计日志_oracle审计日志-CSDN博客
ORA-12899报错,遇到数据表某字段长度奇怪现象:"Oracle字符型,长度50"但length查却没有50_varchar(50) oracle 超出截断-CSDN博客