神奇的事务AUTONOMOUS TRANSACTION

本文介绍Oracle自治事务(Autonomous Transaction)的概念及使用方法,并通过实例展示如何独立于外部事务进行提交操作。
今天从项目中看到一个触发器,看到一段
PROCEDURE a(v_apply_no NUMBER,v_line_no NUMBER,v_rma_center NUMBER) IS 
PRAGMA AUTONOMOUS_TRANSACTION;

以前都没见过这个AUTONOMOUS_TRANSACTION,于是google之
找了好几篇,弄明白大概是干什么用的了
原文大概是这样:
Autonomous Transactions允许你不理会当前的上下文环境,去完成一个新的transaction,而当你回到原来的上下文环境的时候,这个新transaction做过的事情不会受到影响。
呃,似乎不太好懂
看个例子吧~
CREATE TABLE at_test (
id NUMBER NOT NULL,
description VARCHAR2(50) NOT NULL
);

INSERT INTO at_test (id, description) VALUES (1, 'Description for 1');
INSERT INTO at_test (id, description) VALUES (2, 'Description for 2');
//先不commit;

然后
DECLARE
PRAGMA AUTONOMOUS_TRANSACTION;
BEGIN
FOR i IN 3 .. 10 LOOP
INSERT INTO at_test (id, description)
VALUES (i, 'Description for ' || i);
END LOOP;
COMMIT;
END;
这时候去SELECT * FROM at_test;会发现有10条记录,
好,rollback 再SELECT * FROM at_test;
有意思的事出现了~只有8条资料,
对,你应该懂了,procedure中的commit只对当前的AUTONOMOUS_TRANSACTION中的insert 动作起了作用,所以前面2个insert就被rollback啦,很好懂吧 :D
<think> 首先,用户的问题是:“我想查找自治事务无法创建自治会话问题的解决方案 请问解决 autonomous transaction 无法创建 autonomous session 的问题”。用户提到了“自治事务无法创建自治会话”,意思是autonomous transaction无法创建autonomous session。 从提供的引用中,我需要提取相关信息来帮助解决这个问题。引用涉及PostgreSQL的自治事务autonomous transaction)。 引用[1]:讨论了PostgreSQL的自治事务,提到了一个补丁和一些资源链接。关键点是关于pragma autonomous_transaction,但这是在Oracle中的概念,PostgreSQL原生不支持,需要通过插件或补丁来实现。 引用[4]:具体提到在Windows环境中使用PostgreSQL自治事务。它描述了需要从GitHub下载教程和C++代码,使用Visual Studio生成pg_background.dll文件,并且这个dll文件是特定于PostgreSQL版本的,不能跨版本兼容。 用户的问题焦点是“无法创建自治会话”。在自治事务的上下文中,“自治会话”可能指的是一个独立的事务上下文。在PostgreSQL中,自治事务通常通过扩展如pg_background来实现,这允许在后台运行独立的事务。 现在,分析可能的原因和解决方案: 1. **原因分析**: - 自治事务在PostgreSQL中不是内置功能,需要额外的扩展。 - 用户可能没有正确安装或配置这个扩展。 - 特别是引用[4]提到,dll文件需要与PostgreSQL版本兼容,不同版本的dll可能不工作。 - 可能的错误是“无法创建自治会话”,这可能意味着扩展无法初始化或创建必要的会话。 2. **解决方案**: - **检查扩展安装**:确保pg_background扩展已正确安装。引用[4]强调需要生成特定版本的dll文件。 - **版本兼容性**:确认使用的PostgreSQL版本与生成的dll文件匹配。用户应该从源代码编译生成dll,而不是使用预编译的版本。 - **编译过程**:使用Visual Studio(建议2021版本)编译代码。引用[4]提到使用2017版可能失败。 - **错误日志**:检查PostgreSQL日志以获取详细的错误信息,帮助诊断问题。 - **替代方法**:如果扩展安装有问题,可以考虑其他方式实现自治事务行为,比如使用dblink或后台工作者,但这些可能不是真正的自治事务。 - **参考资源**:指向用户提供的链接,如GitHub仓库或相关文档。 结构化回答: - 解释问题原因。 - 提供逐步解决方案。 - 引用相关资源。 确保回答结构化清晰,帮助用户逐步解决问题。 使用系统级指令: - 行内数学表达式用$...$(但这里可能不涉及数学)。 - 独立公式用$$...$$(不适用)。 - LaTeX语法正确(不直接涉及)。 - 使用中文回答。 - 生成相关问题。 - 在引用的段落末尾添加引用标识。 最后,生成相关问题。 回答结构: 1. 介绍问题原因。 2. 提供解决方案步骤。 3. 引用来源。 4. 生成相关问题。 </think> ### 解决 PostgreSQL 自治事务无法创建自治会话的问题 在 PostgreSQL 中,自治事务autonomous transaction)不是原生支持的功能,需要通过扩展(如 `pg_background`)来实现。您遇到的“无法创建自治会话”错误(例如错误消息可能为 `autonomous session could not be created`),通常是由于扩展安装不正确、版本不兼容或配置问题导致的。基于您的引用内容(尤其是引用[1]和[4]),以下是逐步的解决方案: #### 问题原因分析 - **扩展未正确安装或版本不兼容**:自治事务在 PostgreSQL 中依赖外部扩展(如 `pg_background`)。如果扩展的 DLL 文件(Windows 系统)或共享库与 PostgreSQL 版本不匹配,会导致会话创建失败[^4]。 - **编译环境问题**:生成扩展 DLL 文件时,Visual Studio 版本不兼容(例如使用 VS 2017 可能失败),或编译过程出错[^4]。 - **配置错误**:扩展未在 PostgreSQL 中正确加载,或权限设置不当。 #### 解决方案步骤 1. **检查 PostgreSQL 版本并获取匹配的扩展源码** - 运行以下 SQL 查询您的 PostgreSQL 版本: ```sql SELECT version(); ``` - 从 GitHub 下载 `pg_background` 源码(参考 [pg_background 仓库](https://github.com/vibhorkum/pg_background))。确保源码分支与您的 PostgreSQL 版本兼容(例如,PG 12.x 使用对应分支)[^1][^4]。 2. **使用 Visual Studio 编译 DLL 文件** - 安装 **Visual Studio 2021**(建议使用此版本,VS 2017 可能有兼容问题)[^4]。 - 打开源码中的 `.sln` 文件,编译生成 `pg_background.dll`。 - 如果编译失败,检查依赖项(如 PostgreSQL 头文件路径是否配置正确)。 - 将生成的 `pg_background.dll` 文件复制到 PostgreSQL 的 `lib` 目录(例如 `C:\Program Files\PostgreSQL\14\lib`)。 3. **在 PostgreSQL 中加载扩展** - 修改 PostgreSQL 配置文件 `postgresql.conf`,确保包含以下行: ```ini shared_preload_libraries = 'pg_background' ``` - 重启 PostgreSQL 服务使配置生效。 - 创建扩展: ```sql CREATE EXTENSION pg_background; ``` 如果报错(如 `could not load library "pg_background"`),检查 DLL 文件权限(确保运行 PostgreSQL 的用户有读取权限)[^4]。 4. **测试自治事务** - 使用 `PRAGMA autonomous_transaction` 语法测试(示例基于 Oracle 风格,需适配): ```sql BEGIN; SELECT background_execute($$ BEGIN; YOUR_AUTONOMOUS_CODE; COMMIT; $$); COMMIT; ``` - 如果仍出现“无法创建自治会话”,检查 PostgreSQL 日志(通常位于 `data/log/` 目录)获取详细错误。 5. **替代方案(如果扩展安装失败)** - 使用 `dblink` 模块模拟自治事务: ```sql SELECT dblink_exec('dbname=yourdb', 'BEGIN; YOUR_CODE; COMMIT;'); ``` - 需先安装 `dblink`: ```sql CREATE EXTENSION dblink; ``` - 注意:这不是真正的自治事务,但可作为临时解决方案[^1]。 - 考虑升级 PostgreSQL:部分较新版本(如 PG 14+)对后台任务支持更好。 #### 注意事项 - **版本兼容性**:不同 PostgreSQL 版本的 DLL 文件不兼容,必须自行编译生成[^4]。 - **资源参考**: - 详细编译教程:参考 [pg_background GitHub 文档](https://github.com/vibhorkum/pg_background)[^1]。 - 自治事务背景:阅读 [PostgreSQL 社区讨论](https://www.postgresql-archive.org/autonomous-transactions-tp5918627p5918645.html)[^1]。 - 如果问题持续,提供 PostgreSQL 日志内容以便进一步诊断。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值