基于PostgreSQL的分布式事务处理

基于PostgreSQL的分布式事务处理,postgresql,distributed-transactions,Postgresql,Distributed Transactions,有人能告诉我如何在PostgreSQL上执行分布式事务吗 我需要启动从节点x到节点y的事务(这个节点有一个数据库)。 但我在网上找不到关于我如何做到这一点的信息 我所能做的就是通过以下方式进行分布式查询: select dblink_connect ('conn','dbname=ConsultaRemota host=192.168.3.9 user=remoto password=12345 port=5432'); select * from dblink('conn','selec

有人能告诉我如何在PostgreSQL上执行分布式事务吗

我需要启动从节点x到节点y的事务(这个节点有一个数据库)。 但我在网上找不到关于我如何做到这一点的信息

我所能做的就是通过以下方式进行分布式查询:

select dblink_connect
('conn','dbname=ConsultaRemota host=192.168.3.9 
 user=remoto password=12345 port=5432');

select * from dblink('conn','select * from tablaremota') as
temp (id_remoto int, nombre_remoto text, descripcion text);

使用dblink不是真正的分布式事务,因为远程事务可能成功,而本地事务可能失败

要执行分布式事务,请执行以下操作:

  • 使用两个数据库上的
    BEGIN
    START transaction
    创建正常事务

  • 在两个数据库上执行工作

  • 完成后,在两个数据库上准备事务:

    PREPARE TRANSACTION 'some_name';
    
    COMMIT PREPARED 'some_name';
    
    此步骤将执行
    COMMIT
    期间可能失败的所有操作,并持久化事务,但尚未提交

    如果该步骤在某个地方失败,请使用
    ROLLBACK
    ROLLBACK PREPARED
    中止所有数据库上的事务

  • 在所有数据库上提交事务:

    PREPARE TRANSACTION 'some_name';
    
    COMMIT PREPARED 'some_name';
    
    这是肯定会成功的

  • 为了可靠地执行分布式事务,您需要一个事务管理器:这是一个跟踪所有分布式事务的软件。此组件必须保留其信息,以便在崩溃中幸存下来。事务管理器的任务是提交或回滚崩溃后处于不完整状态的任何事务

    这是必要的,因为即使重新启动数据库,准备好的事务也会保留,并且它们会持有锁并阻止
    VACUUM
    进程。这种孤立的准备事务可能会破坏数据库


    不要在没有事务管理器的情况下使用分布式事务

    如何使用connect字符串说数据库在另一台电脑中。这是我的问题:(,你能帮我吗?这是另一个问题。但请注意,Stackoverflow是一个问答论坛,不适合用于教程或教学会议。我看到很多人在任何问题上寻求帮助,也有很多人寻求帮助。无论如何,谢谢你:“)。