偷跑篇:EDB11新的小功能—PRAGMA AUTONOMOUS TRANSACTION

20180531BannerV1
5/31 Elasticsearch搜索、分析和存儲研討會
2018-05-16
EDB_F
9/28 EnterpriseDB Postgres 體驗營
2018-10-01

關聯式資料庫有交易的概念,確保多用戶進行資料的查詢/異動有一個規範。有一些 Oracle 用戶會使用到更進階的交易,叫做 Autonomous Transaction,能夠從當前交易中「再」分支的一個交易。

通常聽到這功能的用途,是有一些作業,需要避免會被當前作業的成敗所影響,最常見的就是額外的 Log 紀錄。

這種功能在 PostgreSQL 裡面其實一直都從缺(可能是因為 PGSQL 社群上開發的人都偏好扁平式的系統設計&規劃?),但是在一些習慣 Oracle 的用戶來說,已經有一些既定的規範,非得使用這種功能才行。

之前已經有一次筆記,演練這個功能的 Workaround 手法,不過現在(2018 年 8 月),下一版的 EDB Postgres 企業版 v11 總算補上了這個「Oracle 相容」功能~

 

這邊直接仿照一篇 Oracle 的教學,直接拿來套用,直接驗證 EDB 的 Oracle 語法相容性~

 

首先建測試表

edb=# CREATE TABLE test (
id NUMBER NOT NULL,
description VARCHAR2(50) NOT NULL
);
CREATE TABLE
edb=#

 

 

然後,套用上面這篇的 Oracle 範例:這邊唯一的小小差別,就是 EDB / PGSQL 的操作指令 psql 預設的是交易模式是 Autocommit,在 Oracle 的 SQL*Plus 預設需要執行 Commit 才行~故這邊使用 begin … commit/rollback 來具體弄成一個交易。

edb=# begin;
BEGIN
edb=# INSERT INTO test (id, description) VALUES (1, 'Description for 1');
INSERT 0 1
edb=# INSERT INTO test (id, description) VALUES (2, 'Description for 2');
INSERT 0 1
edb=# DECLARE
edb-#   PRAGMA AUTONOMOUS_TRANSACTION;
edb$# BEGIN
edb$#   FOR i IN 3 .. 10 LOOP
edb$#     INSERT INTO test (id, description)
edb$#     VALUES (i, 'Description for ' || i);
edb$#   END LOOP;
edb$#   COMMIT;
edb$# END;

EDB-SPL Procedure successfully completed
edb=# SELECT * FROM test;

 id |    description
----+--------------------
  1 | Description for 1
  2 | Description for 2
  3 | Description for 3
  4 | Description for 4
  5 | Description for 5
  6 | Description for 6
  7 | Description for 7
  8 | Description for 8
  9 | Description for 9
 10 | Description for 10
(10 rows)

edb=# ROLLBACK;
ROLLBACK
edb=# SELECT * FROM test;
 id |    description
----+--------------------
  3 | Description for 3
  4 | Description for 4
  5 | Description for 5
  6 | Description for 6
  7 | Description for 7
  8 | Description for 8
  9 | Description for 9
 10 | Description for 10
(8 rows)

edb=#

 

 

上面可見,透過 AUTONOMOUS_TRANSACTION 所塞的資料,並沒有因為這邊的 Rollback 而被取消。而當前交易所塞進去的前兩筆資料,則因為 Rollback 而取消了。

 

另外,這邊可以看到,此處使用的是 Oracle 相容語法,並不是用在 PGSQL 原生的 Function 或是 PGSQL 11 將引進能處理交易的 Procedure 功能,但是看到 Procedure 功能導入,就可以猜測,後續原生的 PGSQL 語法也應該會支援了。

 

這篇是使用 EDB 公司在八月初發行的 Beta 測試版進行練習的,不過通常 PGSQL 的軟體到了 Beta 階段,功能上就已經固定下來了,主要都是在除錯而已~所以這篇叫做偷跑篇(同時也是一則流水帳、拖杳篇)~~

 

當然,EDB 11 不會只有這個改進而已(也會包含 PGSQL 11 新增改進),等到正式出來,再來看看要挑什麼來練習吧~

 

參考資料

ORACLE-BASE – Autonomous Transactions

PL/SQL Language Elements – AUTONOMOUS_TRANSACTION Pragma

EPASv11 release notes

PostgreSQL 11 – Server-side Procedures (Part 1) | 2ndQuadrant Blog

Tech preview: PostgreSQL 11 – CREATE PROCEDURE – Cybertec

PostgreSQL 11 : Procedures are coming – Blog dbi services

PostgreSQL 11 New Features With Examples (Beta 1) – Noriyoshi Shinoda ( HPE Japan Co, Ltd. )