PostgreSQL dblink 与 Spring Boot @Transactional 的事务整合


1. 基本问题分析

dblink 连接默认是自动提交(auto-commit)模式,这意味着每个 dblink_exec 调用都会立即提交,不受外层 Spring 事务管理器的控制。

2. 解决方案

java 复制代码
@Service
@RequiredArgsConstructor
public class DataTransferService {
    
    private final JdbcTemplate jdbcTemplate;
    
    @Transactional
    public void transferDataWithRollback() {
        try {
            // 建立连接并禁用自动提交
            jdbcTemplate.execute(
                "SELECT dblink_connect('transfer_conn', " +
                "'dbname=remote_db user=user password=pass host=remote_host port=5432 autocommit=off')");
            
            // 开始事务块
            jdbcTemplate.execute("BEGIN");
            
            // 本地操作
            jdbcTemplate.update("INSERT INTO local_audit (operation) VALUES ('data transfer started')");
            
            // 远程操作
            jdbcTemplate.execute(
                "SELECT dblink_exec('transfer_conn', " +
                "'INSERT INTO remote_data (id, content) VALUES (1, ''test content'')')");
            
            // 模拟业务逻辑
            if (someBusinessCondition()) {
                throw new RuntimeException("Business validation failed");
            }
            
            // 提交事务
            jdbcTemplate.execute("COMMIT");
            
        } catch (Exception e) {
            // 回滚事务
            jdbcTemplate.execute("ROLLBACK");
            throw new DataTransferException("Data transfer failed", e);
            
        } finally {
            // 确保连接关闭
            jdbcTemplate.execute("SELECT dblink_disconnect('transfer_conn')");
        }
    }
    
    private boolean someBusinessCondition() {
        // 你的业务逻辑
        return false;
    }
}
相关推荐
AC赳赳老秦6 分钟前
OpenClaw与思维导图工具联动:自动生成工作规划脑图、拆解任务节点,适配职场管理
java·大数据·服务器·数据库·python·php·openclaw
海兰26 分钟前
【第54篇】Graph + Langfuse 可观测性实战
java·人工智能·spring boot·spring ai
zhishijike26 分钟前
全国行政区划sql(省市区)
数据库·sql·mysql
KaMeidebaby36 分钟前
卡梅德生物技术快报|单 B 细胞抗体技术:全犬源单抗制备流程、关键参数与性能验证
前端·数据库·其他·百度·新浪微博
KG_LLM图谱增强大模型40 分钟前
scHilda:大模型与知识图谱分层融合,突破单细胞分型瓶颈
数据库·人工智能·知识图谱
凯瑟琳.奥古斯特42 分钟前
力扣3654:二维矩阵连续空位统计
数据结构·数据库·算法·职场和发展
qq_5470261791 小时前
SpringBoot + Redis 电商秒杀完整方案
spring boot·redis·后端
满昕欢喜1 小时前
SQL Server的概述与安装
数据库·sqlserver
2501_930707781 小时前
使用C#代码在 Excel 中为数据透视表添加筛选器
数据库·数据挖掘·数据分析
那个失眠的夜1 小时前
SpringBoot
java·开发语言·spring boot·spring·mvc·mybatis