在默认情况下,PostgreSQL没有打开两阶段提交的功能,能通过设置max_prepared_transactions参数为0来阻止用户开启两阶段提交事务,用户可以根据自己的需要,设置max_prepared_transactions参数的值来保证同时支持几个两阶段提交事务,PostgreSQL的两阶段提交事务的SQL接口如下。
SQL接口 | 说明 |
PREPARE TRANSACTION ‘gid’ | 两阶段提交事务的Prepare阶段 |
COMMIT PREPARED ‘gid’ | 如果第一个阶段决定提交事务,那么执行COMMIT PREPARED |
ROLLBACK PREPARED ‘gid’ | 如果第一个阶段决定回滚事务,那么执行ROLLBACK PREPARED |
当用户通过PREPARE TRANSACTION语句去开始一个两阶段提交操作时,PG会调用PrepareTransactionBlock函数,在这个函数中会阐释转换事务块的状态TBLOCK_PREPARE。
当语句结束时(当前command结束),CommitTransactionCommand函数会调用PrepareTransaction函数,这个函数会真正开始在共享内存建立一个全局事务,同时会将事务的资源信息写入磁盘(通过WAL及文件的方式)。此时,这个事务就和当前的Backend解除绑定,无论是退出当前会话还是重启PG,这个PREPARE的事务会一直存在,事务占用的资源也不会释放。