• 云贝教育 | 【技术文章】pg中的两阶段提交


    注: 本文为云贝教育 刘峰 原创,请尊重知识产权,转发请注明出处,不接受任何抄袭、演绎和未经注明出处的转载。

    一、两阶段概述

    两阶段提交(Two-Phase Commit,2PC)是一种在分布式系统中确保事务原子性的协议。在PostgreSQL中,两阶段提交允许你创建一个预备事务,这个预备事务可以在一个或多个数据库之间进行提交或回滚,从而确保所有的数据库要么都提交事务,要么都不提交。

    两阶段提交在PostgreSQL中的使用通常涉及以下步骤:

    1. 准备事务:在PostgreSQL中,你可以通过`PREPARE TRANSACTION 'transaction_id';`命令来准备一个事务。这个命令会开始一个事务,但不会立即提交它。在这个阶段,所有的事务更改都会被保存,但还没有被最终提交。

    2. 提交或回滚事务:一旦事务被准备好,你可以选择提交或回滚事务。如果你想提交事务,可以使用`COMMIT PREPARED 'transaction_id';`命令。如果你想回滚事务,可以使用`ROLLBACK PREPARED 'transaction_id';`命令。在这个阶段,所有的数据库都会同步执行相同的操作,从而确保事务的一致性。

    请注意,两阶段提交协议是一种强一致性协议,它可能会影响系统的性能。在选择使用它时,需要权衡一致性和性能之间的关系。

    二、两阶段提交实验
    2.1 修改参数max_prepared_transactions

     该参数必须重启才能生效,设置为10

    1. postgre=# select name,setting from pg_settings where name like '%transactions%';
    2. name | setting
    3. ---------------------------+---------
    4. max_prepared_transactions | 10
    5. (1 row)
    2.2 创建表并开始事务
    1. postgre=# create table testtab0l(id int primary key);
    2. CREATE TABLE
    3. postgre=# begin;
    4. BEGIN
    5. postgre=# insert into testtab0l values(1);
    6. INSERT 0 1
    7. postgre=# PREPARE TRANSACTION 'pg global trans 0001';
    8. PREPARE TRANSACTION

    命令中“osdba global trans0001”是两阶段提交中全局事务的ID,由事务协调器生成(事务协调器也可能是由应用实现的,事务协调器会持久化这个全局事务ID.PostgreSQL数据库一旦 成功执行这条命令,就会把此事务持久化,意思是即使数据库重启,此事务既不会回滚,也不会丢失)。

    2.3 重启pg
    $ pg_ctl restart  -d $PGDATA
    2.4  查看并提交
    1. [postgre@cdh02 ~]$ psql
    2. psql (12.4)
    3. Type "help" for help.
    4. postgre=# select * from testtab0l;
    5. id
    6. ----
    7. (0 rows)
    8. ---此时无数据
    2.5 提交全局事务
    
    1. postgre=# COMMIT PREPARED 'pg global trans 0001';
    2. COMMIT PREPARED
    3. postgre=# select * from testtab0l;
    4. id
    5. ----
    6. 1
    7. (1 row)
    从上面的例子可以看出,一旦成功执行“PREPARE TRANSACTION”命令,事务就会被持久化,即使重启数据库,仍然可以提交这个事务,事务中的操作不会丢失。
    
  • 相关阅读:
    LLM 位置编码及外推
    C#中的DateTime类
    《你的第一本哲学书》- 是否存在外部世界
    论文笔记:Pointing Novel Objects in Image Captioning
    MATLAB实现希尔伯特变换以及FFT补零分析
    python 库
    如何修改默认YUM仓库 安装扩展仓库
    Java Web3J :使用web3j监听、查询、订阅智能合约的事件
    致敬记者节,合合信息扫描全能王助力新闻工作者构建“随身资料库”
    Arduino从零开始(1)——按钮控制LED
  • 原文地址:https://blog.csdn.net/yunbee666/article/details/136658701