PostgreSQL事务的操作命令

一、一般情况下,事务是自动提交的。参数autocommit控制事务是否自动提交。

postgres=#showautocommit;
autocommit
------------
on

二、开启一个事务的命令有:

http://www.postgresql.org/docs/9.4/static/sql-begin.html

http://www.postgresql.org/docs/9.4/static/sql-start-transaction.html

1. BEGIN;

2. START TRANSACTION [ transaction_mode [,...] ]

这里的transaction_mode是下列之一:

ISOLATIONLEVEL{SERIALIZABLE|REPEATABLEREAD|READCOMMITTED|READUNCOMMITTED}
READWRITE|READONLY
[NOT]DEFERRABLE
postgres=#begin;
BEGIN
postgres=#starttransaction;
STARTTRANSACTION


三、 设置事务的模式

http://www.postgresql.org/docs/9.1/static/sql-set-transaction.html

SETTRANSACTIONtransaction_mode[,...]
SETTRANSACTIONSNAPSHOTsnapshot_idSETSESSIONcharacteristicsASTRANSACTIONtransaction_mode[,...]
这里的transaction_mode是下列之一:
ISOLATIONLEVEL{SERIALIZABLE|REPEATABLEREAD|READCOMMITTED|READUNCOMMITTED}
READWRITE|READONLY
[NOT]DEFERRABLE

例如:用一个早已存在的事务的相同快照开始一个新的事务。

首先从现存事务中输出快照。 这将返回快照的标识符,例如:

BEGIN TRANSACTION ISOLATION LEVEL REPEATABLE READ; --启动时设置事务的隔离级别;
SELECT pg_export_snapshot();
pg_export_snapshot
--------------------
000003A1-1
(1 row)

然后在新打开的事务的开始的SET TRANSACTION SNAPSHOT命令中给出快照标识符:

BEGIN TRANSACTION ISOLATION LEVEL REPEATABLE READ; --启动时设置事务的隔离级别;
SET TRANSACTION SNAPSHOT '000003A1-1';


四、结束事务的命令有:

http://www.postgresql.org/docs/9.4/static/sql-commit.html

http://www.postgresql.org/docs/9.4/static/sql-rollback.html

  1. 提交 commit;

  2. 回滚 rollback;

postgres=#commit;
COMMIT
postgres=#rollback;
ROLLBACK

五、预备事务

创建预备事务,是为当前事务分阶段提交做准备的。

http://www.postgresql.org/docs/9.4/static/sql-prepare-transaction.html

PREPARETRANSACTION'transaction_tag';

PREPARE TRANSACTION为当前事务的分阶段提交做准备。在命令之后, 事务就不再和当前会话关联了;它的状态完全保存在磁盘上,它提交成功有非常高的可能性, 即使是在请求提交之前数据库发生了崩溃也如此。

例如:把当前事务为阶段提交做准备,使用foobar做为事务标识符:

PREPARETRANSACTION'foobar';

提交预备事物,提交一个早先为分阶段提交的预备事务。

http://www.postgresql.org/docs/9.4/static/sql-commit-prepared.html

COMMITPREPAREDtransaction_id

注意:要提交一个预处理的事务,你必须是最初执行该事务的用户或超级用户。 不过你不必在同一个会话里执行该命令。

这条命令不能在事务块里执行。预处理的事务立即提交。

所有目前可用的预处理事务都在系统视图pg_prepared_xacts里列出。

例如:提交事务标识符foobar标识的事务:

COMMITPREPARED'foobar';

完整例子:

首先要启动prepare transaction,否则的话会报如下错误

postgres=#preparetransaction'dd';
ERROR:preparedtransactionsaredisabled
提示:Setmax_prepared_transactionstoanonzerovalue.
postgres=#setmax_prepared_transactions=2;
ERROR:parameter"max_prepared_transactions"cannotbechangedwithoutrestarti
ngtheserver

要启动要启动prepare transaction,需要到postgresql.conf配置文件中,将参数max_prepare_transactions设置为非零的值,然后重启数据库服务即可。

postgres=#begintransaction;
BEGIN
postgres=#insertintojnkx.testvalues(2,'dd');
INSERT01
postgres=#preparetransaction'c';
PREPARETRANSACTION
postgres=#select*fromjnkx.test;
id|name
----+------
1|dd
postgres=#commitprepared'c';
COMMITPREPARED
postgres=#select*fromjnkx.test;
id|name
----+------
1|dd
2|dd

相关文章

项目需要,有个数据需要导入,拿到手一开始以为是mysql,结果...
本文小编为大家详细介绍“怎么查看PostgreSQL数据库中所有表...
错误现象问题原因这是在远程连接时pg_hba.conf文件没有配置正...
因本地资源有限,在公共测试环境搭建了PGsql环境,从数据库本...
wamp 环境 这个提示就是说你的版本低于10了。 先打印ph...
psycopg2.OperationalError: SSL SYSCALL error: EOF detect...