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;
    }
}
相关推荐
哈基米喜欢哈哈哈2 小时前
Spring Boot 3.5 新特性
java·spring boot·后端
郭俊强3 小时前
nestjs 连接redis
数据库·redis·缓存
海边捡石子3 小时前
postgress数据迁移gaussdb注意事项
数据库
chen_note3 小时前
Redis数据持久化——RDB快照和Aof日志追加
java·数据库·mybatis·持久化·aof·rdb
携欢4 小时前
PortSwigger靶场之SQL injection with filter bypass via XML encoding通关秘籍
xml·数据库·sql
GBASE4 小时前
GBASE南大通用技术分享:GBase 8s数据库Q转义功能解析(上)
数据库
闲人编程4 小时前
PyQt6 进阶篇:构建现代化、功能强大的桌面应用
数据库·python·oracle·gui·脚本·pyqt6·软件
speop4 小时前
【datawhale组队学习】RAG技术 -TASK05 向量数据库实践(第三章3、4节)
数据库·学习
EnigmaCoder4 小时前
【Linux】用户与用户组管理
linux·运维·服务器·数据库
lssjzmn5 小时前
针对不同使用场景,Redis的Value应该如何序列化,优缺点如何,进来看
spring boot·redis