2019独角兽企业重金招聘Python工程师标准>>>
一、一般情况下,事务是自动提交的。参数autocommit控制事务是否自动提交。
postgres=# show autocommit;
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是下列之一:
ISOLATION LEVEL { SERIALIZABLE | REPEATABLE READ | READ COMMITTED | READ UNCOMMITTED }
READ WRITE | READ ONLY
[ NOT ] DEFERRABLE
postgres=# begin;
BEGIN
postgres=# start transaction;
START TRANSACTION
三、 设置事务的模式
http://www.postgresql.org/docs/9.1/static/sql-set-transaction.html
SET TRANSACTION transaction_mode [, ...]
SET TRANSACTION SNAPSHOT snapshot_idSET SESSION CHARACTERISTICS AS TRANSACTION transaction_mode [, ...]
这里的 transaction_mode是下列之一:
ISOLATION LEVEL { SERIALIZABLE | REPEATABLE READ | READ COMMITTED | READ UNCOMMITTED }
READ WRITE | READ ONLY
[ 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
提交 commit;
回滚 rollback;
postgres=# commit;
COMMIT
postgres=# rollback;
ROLLBACK
五、预备事务
创建预备事务,是为当前事务分阶段提交做准备的。
http://www.postgresql.org/docs/9.4/static/sql-prepare-transaction.html
PREPARE TRANSACTION 'transaction_tag';
PREPARE TRANSACTION为当前事务的分阶段提交做准备。在命令之后, 事务就不再和当前会话关联了;它的状态完全保存在磁盘上,它提交成功有非常高的可能性, 即使是在请求提交之前数据库发生了崩溃也如此。
例如:把当前事务为阶段提交做准备,使用foobar做为事务标识符:
PREPARE TRANSACTION 'foobar';
提交预备事物,提交一个早先为分阶段提交的预备事务。
http://www.postgresql.org/docs/9.4/static/sql-commit-prepared.html
COMMIT PREPARED transaction_id
注意:要提交一个预处理的事务,你必须是最初执行该事务的用户或超级用户。 不过你不必在同一个会话里执行该命令。
这条命令不能在事务块里执行。预处理的事务立即提交。
所有目前可用的预处理事务都在系统视图pg_prepared_xacts里列出。
例如:提交事务标识符foobar标识的事务:
COMMIT PREPARED 'foobar';
完整例子:
首先要启动prepare transaction,否则的话会报如下错误:
postgres=# prepare transaction 'dd';
ERROR: prepared transactions are disabled
提示: Set max_prepared_transactions to a nonzero value.
postgres=# set max_prepared_transactions=2;
ERROR: parameter "max_prepared_transactions" cannot be changed without restarti
ng the server
要启动要启动prepare transaction,需要到postgresql.conf配置文件中,将参数max_prepare_transactions设置为非零的值,然后重启数据库服务即可。
postgres=# begin transaction;
BEGIN
postgres=# insert into jnkx.test values(2,'dd');
INSERT 0 1
postgres=# prepare transaction 'c';
PREPARE TRANSACTION
postgres=# select * from jnkx.test;
id | name
----+------
1 | dd
postgres=# commit prepared 'c';
COMMIT PREPARED
postgres=# select * from jnkx.test;
id | name
----+------
1 | dd
2 | dd