postgresql - PostgreSQL 上的分布式事务

标签 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','select * from tablaremota') as
temp (id_remoto int, nombre_remoto text, descripcion text);

最佳答案

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

执行分布式事务:

  1. 使用 BEGIN 创建正常交易或START TRANSACTION在两个数据库上。

  2. 在两个数据库上执行工作。

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

    PREPARE TRANSACTION 'some_name';
    

    此步骤将执行 COMMIT 期间可能会失败的所有操作。并持久化事务,但它还不会提交它。

    如果该步骤在某处失败,请使用 ROLLBACKROLLBACK PREPARED中止所有数据库上的事务。

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

    COMMIT PREPARED 'some_name';
    

    这一定会成功。

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

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

切勿在没有事务管理器的情况下使用分布式事务!

关于postgresql - PostgreSQL 上的分布式事务,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65830457/

相关文章:

postgresql - 如何找到导致 Postgres CPU Utilization 急剧增加的原因?

postgresql - Node postgres : Setting max connection pool size

python - 使用 psycopg3 在服务器之间复制表

distributed-computing - 拜占庭将军

mysql - 当前不支持同一事务内的多个同时连接或具有不同连接字符串的连接

postgresql - Airflow PostgresHook 从未提交的 Insert 语句返回 ID

sql - 存储过程内循环内的事务

.net检测分布式事务

mysql - sql server和mysql之间链接服务器上的分布式事务

java - 通过 JDBC 连接到 CloudSQL for PostgreSQL 时,如何在类路径上指定 SSL 证书?