作者
digoal
日期
2019-03-30
标签
PostgreSQL , rollback , commit , chain , 继承事务特性
背景
事务启动特性如下:
```
SET TRANSACTION transaction_mode [, ...]
SET TRANSACTION SNAPSHOT snapshot_id
SET SESSION CHARACTERISTICS AS TRANSACTION transaction_mode [, ...]
where transaction_mode is one of:
ISOLATION LEVEL { SERIALIZABLE | REPEATABLE READ | READ COMMITTED | READ UNCOMMITTED } READ WRITE | READ ONLY [ NOT ] DEFERRABLE
复制
```
当事务结束时,如果立即需要开启一个新事务,这个新事务可以继承之前事务的特性(例如rr隔离级别)。
https://git.postgresql.org/gitweb/?p=postgresql.git;a=commit;h=280a408b48d5ee42969f981bceb9e9426c3a344c
https://www.postgresql.org/docs/devel/sql-commit.html
COMMIT [ WORK | TRANSACTION ] [ AND [ NO ] CHAIN ]
AND CHAIN
If AND CHAIN is specified, a new transaction is immediately started with the same transaction characteristics
(see SET TRANSACTION) as the just finished one.
Otherwise, no new transaction is started.
例子
当事务结束时,立即启动一个新事务,并且继承上一个事务的特性。
+-- transaction chain
+TRUNCATE test1;
+DO LANGUAGE plpgsql $$
+BEGIN
+ ROLLBACK;
+ SET TRANSACTION ISOLATION LEVEL REPEATABLE READ;
+ FOR i IN 0..3 LOOP
+ RAISE INFO 'transaction_isolation = %', current_setting('transaction_isolation');
+ INSERT INTO test1 (a) VALUES (i);
+ IF i % 2 = 0 THEN
+ COMMIT AND CHAIN;
+ ELSE
+ ROLLBACK AND CHAIN;
+ END IF;
+ END LOOP;
+END
+$$;
+INFO: transaction_isolation = repeatable read
+INFO: transaction_isolation = repeatable read
+INFO: transaction_isolation = repeatable read
+INFO: transaction_isolation = repeatable read
+SELECT * FROM test1;
+ a | b
+---+---
+ 0 |
+ 2 |
+(2 rows)
参考
https://www.postgresql.org/docs/devel/sql-set-transaction.html
https://www.postgresql.org/docs/devel/sql-commit.html
PostgreSQL 许愿链接
您的愿望将传达给PG kernel hacker、数据库厂商等, 帮助提高数据库产品质量和功能, 说不定下一个PG版本就有您提出的功能点. 针对非常好的提议,奖励限量版PG文化衫、纪念品、贴纸、PG热门书籍等,奖品丰富,快来许愿。开不开森.