自治事务 PRAGMA AUTONOMOUS TRANSACTION

本文介绍了Markdown编辑器的最新改进,包括全新界面设计、图片拖拽功能、KaTeX数学公式、甘特图和流程图支持等。此外,还详细讲解了功能快捷键、文本样式、列表和表格的创建,以及导入导出功能。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

分享一下我老师大神的人工智能教程!零基础,通俗易懂!http://blog.youkuaiyun.com/jiangjunshow

也欢迎大家转载本篇文章。分享知识,造福人民,实现我们中华民族伟大复兴!

                在触发器中操作触发此触发器的表,用PRAGMA AUTONOMOUS_TRANSACTION选项。

15.1为何使用自治事务 无法回滚的审计

一般情况下利用触发器禁止某些对表的更新等操作时,若记录日志,则触发器最后抛出异常时会造成日志回滚。利用自治事务可防止此点。

避免变异表

即在触发器中操作触发此触发器的表

在触发器中使用DDL 写数据库

对数据库有写操作(INSERT、UPDATE、DELETE、CREATE、ALTER、COMMIT)的存储过程或函数是无法简单的用SQL来调用的,此时可以将其设为自治事务,从而避免ORA-14552(无法在一个查询或DML中执行DDL、COMMIT、ROLLBACK)、ORA-14551(无法在一个查询中执行DML操作)等错误。需要注意的是函数必须有返回值,但仅有IN参数(不能有OUT或IN/OUT参数)。

开发更模块化的代码

在大型开发中,自治事务可以将代码更加模块化,失败或成功时不会影响调用者的其它操作,代价是调用者失去了对此模块的控制,并且模块内部无法引用调用者未提交的数据。

15.2 如何工作 事务控制

DECLARE整个块都是属于父事务的,自治事务从离PRAGMA后的第一个BEGIN开始,只要此BEGIN块仍在作用域,则都属于自治事务。例如在DECLARE模块中声明一个写数据库的函数,则此函数虽然在自治事务所在存储过程执行,但其属于父事务;而自治事务中调用的任何函数和存储过程、激发的任何触发器等均为此自治事务的一部分。

自治事务可以嵌套,嵌套深度等只受INIT.ORA参数TRANSACTIONS(同时并发的事务数,缺省为SESSIONS的1.1倍)制约。

作用域

1. 包中的变量

自治事务可看到并修改父事务的变量,父事务也会察觉到这一改变,且不存在回滚问题。

2. 会话设置/参数

自治事务与父事务共享同一个会话环境,通过ALTER SESSION作的修改对整个会话均有效。但SET TRANSACTION是事务级的,仅对提起修改的事务有效。

3. 数据库修改

父事务已提交的修改对自治事务可见,未提交的对自治事务不可见,自治事务的修改对父事务是否可见取决于隔离级别(Isolation Level)。

对于游标,取决于其打开的位置,若其在父事务中打开,则之前父事务未提交的修改对其是有效的,在自治事务中这些修改也可见;而在自治事务中打开,则父事务未提交的修改不可见。

若使用缺省的READ COMMITTED隔离级别,则自治事务的修改对父事务可见;若改用SERIALIZABLE,则不可见。

4. 锁

父事务与自治事务是完全不同的事务,因此无法共享锁等。

结束一个自治事务必须提交一个COMMIT、ROLLBACK或执行DDL。

保存点无法在自治事务中回滚到父事务中的一个保存点,只能在内部使用保存点。

15.3 最后说明 不支持分布式事务截至8.1.7在自治事务中不支持分布式事务

仅可用PL/SQL 全部事务回滚若自治事务出错,则全部回滚,即便父事务有异常处理模块。

事务级临时表每个会话仅一个事务可访问事务级临时表(多个会话中的事务可并发操作)。

15.4 可能遇到的错误
ORA-06519 – 检查到活动自治事务,回滚——退出自治事务时没有提交、回滚或DDL操作

ORA-14450 – 试图访问正在使用的事务级临时表

ORA-00060 – 等待资源时检查到死锁
            

给我老师的人工智能教程打call!http://blog.youkuaiyun.com/jiangjunshow
这里写图片描述
你好! 这是你第一次使用 **Markdown编辑器** 所展示的欢迎页。如果你想学习如何使用Markdown编辑器, 可以仔细阅读这篇文章,了解一下Markdown的基本语法知识。

新的改变

我们对Markdown编辑器进行了一些功能拓展与语法支持,除了标准的Markdown编辑器功能,我们增加了如下几点新功能,帮助你用它写博客:

  1. 全新的界面设计 ,将会带来全新的写作体验;
  2. 在创作中心设置你喜爱的代码高亮样式,Markdown 将代码片显示选择的高亮样式 进行展示;
  3. 增加了 图片拖拽 功能,你可以将本地的图片直接拖拽到编辑区域直接展示;
  4. 全新的 KaTeX数学公式 语法;
  5. 增加了支持甘特图的mermaid语法1 功能;
  6. 增加了 多屏幕编辑 Markdown文章功能;
  7. 增加了 焦点写作模式、预览模式、简洁写作模式、左右区域同步滚轮设置 等功能,功能按钮位于编辑区域与预览区域中间;
  8. 增加了 检查列表 功能。

功能快捷键

撤销:Ctrl/Command + Z
重做:Ctrl/Command + Y
加粗:Ctrl/Command + B
斜体:Ctrl/Command + I
标题:Ctrl/Command + Shift + H
无序列表:Ctrl/Command + Shift + U
有序列表:Ctrl/Command + Shift + O
检查列表:Ctrl/Command + Shift + C
插入代码:Ctrl/Command + Shift + K
插入链接:Ctrl/Command + Shift + L
插入图片:Ctrl/Command + Shift + G

合理的创建标题,有助于目录的生成

直接输入1次#,并按下space后,将生成1级标题。
输入2次#,并按下space后,将生成2级标题。
以此类推,我们支持6级标题。有助于使用TOC语法后生成一个完美的目录。

如何改变文本的样式

强调文本 强调文本

加粗文本 加粗文本

标记文本

删除文本

引用文本

H2O is是液体。

210 运算结果是 1024.

插入链接与图片

链接: link.

图片: Alt

带尺寸的图片: Alt

当然,我们为了让用户更加便捷,我们增加了图片拖拽功能。

如何插入一段漂亮的代码片

博客设置页面,选择一款你喜欢的代码片高亮样式,下面展示同样高亮的

<think>嗯,用户问的是OpenGauss数据库是否支持PRAGMA AUTONOMOUS_TRANSACTION这个声明来实现自治事务。首先,我需要回忆一下OpenGauss的特性。我记得OpenGauss是基于PostgreSQL开发的,而PostgreSQL本身并不支持Oracle那样的自治事务,通常是通过过程语言扩展比如PL/pgSQL的某些特性或者通过其他方式模拟。不过,用户提到的PRAGMA AUTONOMOUS_TRANSACTION是Oracle的语法,通常在PL/SQL中使用,所以可能是在问OpenGauss有没有类似的机制。 接下来,我需要确认OpenGauss的官方文档是否有相关说明。根据之前的了解,OpenGauss主要兼容PostgreSQL,但可能也加入了一些自己的特性。不过自治事务在PostgreSQL社区中通常通过扩展如dbms_自治事务来实现,或者通过提交点的方式。比如,在PL/pgSQL中,每个异常块可能会自动成为一个子事务,但完全的自治事务需要显式处理。 然后,用户提到的PRAGMA关键字,这在Oracle中是用于编译指令的,比如设置某些参数。但在OpenGauss中,PRAGMA可能不被支持,因为这是Oracle特有的语法。所以,可能OpenGauss并不直接支持这样的声明,而是需要通过其他方式实现自治事务。 接下来,我需要考虑用户的实际需求。用户可能是在迁移Oracle数据库到OpenGauss,遇到了自治事务的问题,想知道如何处理。这时候,可能需要给出替代方案,比如使用存储过程中的子事务,或者使用dblink来模拟自治事务,或者安装扩展模块。 不过,需要注意的是,OpenGauss是否支持这些方法。比如,使用dblink连接到本地数据库,在另一个会话中执行事务,这样可以独立提交,但这种方法可能会影响性能,并且需要配置dblink。另外,是否有官方的扩展支持自治事务,比如类似于PostgreSQL的dbms_自治事务模块,但不确定OpenGauss是否已经包含或者需要单独安装。 另外,可能需要举例说明如何在OpenGauss中实现自治事务的效果。例如,在存储过程中使用EXCEPTION块,或者在特定位置使用SAVEPOINT和COMMIT来部分提交事务。不过,这可能需要仔细设计代码结构。 最后,还需要提醒用户,尽管可以通过这些方法模拟自治事务,但和Oracle的原生支持还是有区别的,特别是在错误处理和事务隔离方面,可能需要更多的测试和调整。 总结来说,回答应该包括:OpenGauss不直接支持PRAGMA AUTONOMOUS_TRANSACTION,但可以通过其他方法如存储过程中的子事务、dblink或扩展模块来实现类似效果,同时给出示例和注意事项。</think>OpenGauss数据库目前**不直接支持** Oracle风格的 `PRAGMA AUTONOMOUS_TRANSACTION` 语法来声明自治事务。不过,可以通过其他方法间接实现类似自治事务的功能。以下是具体介绍和替代方案: --- ### **1. 自治事务的核心需求** 自治事务的核心目的是在**主事务未提交时**,允许某个子操作(如存储过程中的日志记录)独立提交事务,且不影响主事务的后续流程。Oracle通过 `PRAGMA AUTONOMOUS_TRANSACTION` 实现这一点,但OpenGauss需借助其他机制。 --- ### **2. OpenGauss的替代方案** #### **方案1:使用存储过程 + 子事务控制** 通过`EXCEPTION`块或显式提交点(`SAVEPOINT`)实现部分操作的独立提交,但需注意事务隔离性: ```sql CREATE OR REPLACE FUNCTION log_operation() RETURNS VOID AS $$ BEGIN -- 主事务操作 INSERT INTO main_table VALUES (1); -- 尝试自治事务(通过子事务模拟) BEGIN INSERT INTO log_table VALUES (NOW(), 'Operation logged'); COMMIT; -- 显式提交子事务 EXCEPTION WHEN OTHERS THEN ROLLBACK; END; END; $$ LANGUAGE plpgsql; ``` #### **方案2:通过dblink模拟自治事务** 使用`dblink`连接到当前数据库,在独立会话中执行操作: ```sql CREATE EXTENSION dblink; CREATE OR REPLACE FUNCTION autonomous_log() RETURNS VOID AS $$ BEGIN PERFORM dblink_connect('autonomous_conn', 'dbname=当前数据库 user=当前用户'); PERFORM dblink_exec('autonomous_conn', 'INSERT INTO log_table VALUES (NOW(), ''Autonomous log''); COMMIT;'); PERFORM dblink_disconnect('autonomous_conn'); END; $$ LANGUAGE plpgsql; ``` #### **方案3:扩展模块支持** 部分开源扩展(如 `pg_autonomous`)可提供类似功能,但需确认与OpenGauss的兼容性。 --- ### **3. 注意事项** - **事务隔离性**:自治事务与主事务的数据可见性可能受隔离级别影响。 - **性能开销**:`dblink`会创建新连接,可能增加资源消耗。 - **错误处理**:需妥善处理子事务中的异常,避免影响主事务。 --- ### **4. 官方建议** OpenGauss推荐通过**逻辑设计规避自治事务需求**(如异步消息队列处理日志),或利用其兼容PostgreSQL的子事务特性(`SAVEPOINT`)拆分操作。如需完整自治事务功能,建议关注官方后续版本更新或社区扩展支持。 希望以上内容能帮助你理解OpenGauss中自治事务的实现方式!如需进一步优化具体场景,可提供更多细节。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值