sql-prepare-transaction.zh.md 3.4 KB
Newer Older
李少辉-开发者's avatar
李少辉-开发者 已提交
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59
## 准备交易

PREPARE TRANSACTION — 为两阶段提交准备当前事务

## 概要

```
PREPARE TRANSACTION transaction_id
```

## 描述

`准备交易`为两阶段提交准备当前事务。执行此命令后,事​​务不再与当前会话关联;相反,它的状态完全存储在磁盘上,即使在请求提交之前发生数据库崩溃,它也有很高的概率可以成功提交。

一旦准备好,事务可以稍后提交或回滚[`提交准备`](sql-commit-prepared.html)或者[`已准备好回滚`](sql-rollback-prepared.html), 分别。这些命令可以从任何会话发出,而不仅仅是执行原始事务的那个。

从发行环节来看,`准备交易`不像一个`回滚`command:执行后,没有活动的当前事务,准备好的事务的效果不再可见。(如果事务提交,效果将再次可见。)

如果`准备交易`命令因任何原因失败,它变成`回滚`: 当前交易被取消。

## 参数

*`transaction_id`*

一个任意标识符,稍后标识此交易`提交准备`或者`已准备好回滚`.标识符必须写为字符串文字,并且长度必须小于 200 字节。它不能与用于任何当前准备的事务的标识符相同。

## 笔记

`准备交易`不适用于应用程序或交互式会话。其目的是允许外部事务管理器跨多个数据库或其他事务资源执行原子全局事务。除非您正在编写事务管理器,否则您可能不应该使用`准备交易`.

此命令必须在事务块内使用。采用[`开始`](sql-begin.html)开始一个。

目前不允许`准备`执行了涉及临时表或会话的临时命名空间的任何操作的事务,创建了任何游标`按住`, 或执行`听`,`不听`, 或者`通知`.这些功能与当前会话联系得太紧密,无法在要准备的事务中使用。

如果事务修改了任何运行时参数`放`(没有`当地的`选项),这些效果在`准备交易`, 以后不会受到影响`提交准备`或者`已准备好回滚`.因此,在这一方面`准备交易`行为更像`犯罪``回滚`.

所有当前可用的准备好的事务都列在[`pg_prepared_xacts`](view-pg-prepared-xacts.html)系统视图。

### 警告

让事务长时间处于准备状态是不明智的。这会干扰能力`真空`回收存储,在极端情况下可能导致数据库关闭以防止事务 ID 回绕(请参阅[第 25.1.5 节](routine-vacuuming.html#VACUUM-FOR-WRAPAROUND))。还要记住,事务继续持有它持有的任何锁。该功能的预期用途是,一旦外部事务管理器验证其他数据库也准备好提交,准备好的事务通常将被提交或回滚。

如果您没有设置外部事务管理器来跟踪准备好的交易并确保它们及时关闭,最好通过设置禁用准备好的交易功能[最大限度\_准备好的\_交易](runtime-config-resource.html#GUC-MAX-PREPARED-TRANSACTIONS)为零。这将防止意外创建准备好的事务,这些事务可能会被遗忘并最终导致问题。

## 例子

为两阶段提交准备当前事务,使用`富吧`作为交易标识符:

```
PREPARE TRANSACTION 'foobar';
```

## 兼容性

`准备交易`是一个 PostgreSQL 扩展。它旨在供外部事务管理系统使用,其中一些已被标准覆盖(例如 X/Open XA),但这些系统的 SQL 端并未标准化。

## 也可以看看

[提交准备](sql-commit-prepared.html),[已准备好回滚](sql-rollback-prepared.html)