成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

PostgreSQL 事務控制及invalid transaction termination研究

IT那活兒 / 2155人閱讀
PostgreSQL 事務控制及invalid transaction termination研究
PostgreSQL 事務控制



在我們做PG遷移的時候,用AWS工具經常會遇到這樣的提示“Transactioncontrol is only possible from the top level or nested callinvocations without any other intervening command”


在點一下具體的問題,如上圖所示,發(fā)現(xiàn)是commit的問題。


這里我寫了一個存儲過程,用python程序調用來測試了一下這個問題。


1.首先創(chuàng)建一個表

create tabletest(a1,a2) as select 1 n,current_timestamp t;


2.接下來創(chuàng)建一個存儲過程

create or replaceprocedure test_insert(a1 int, a2 int) as

$$

begin

for i in a1..a2loop

insert into testvalues (i,current_timestamp);

commit;

end loop;

end;

$$ language plpgsql;


3.在命令行執(zhí)行調用

存儲過程執(zhí)行成功,插入4條數(shù)據(jù)。


4.接下來我們使用python程序來調用存儲過程

Python程序代碼如下:

執(zhí)行python


發(fā)現(xiàn)報錯,這里報“invalidtransaction termination”,然后指向存儲過程第5行COMMIT。


5.取消存儲過程中的commit

這一次把commit取消,再次執(zhí)行python

查詢數(shù)據(jù)庫中的數(shù)據(jù)


通過測試可以發(fā)現(xiàn),在命令行中不管你在存儲過程中加commit或者不加commit,都不會報錯。而通過外部程序調用的情況,如果你在存儲過程中加了commit,就會報“invalidtransaction termination”


通過搜索,我們發(fā)現(xiàn)官方文檔如下描述。

If CALL isexecuted in a transaction block, then the called procedure cannotexecute transaction control statements. Transaction controlstatements are only allowed if CALL isexecuted in its own transaction.


如果CALL在事務塊中執(zhí)行,則被調用的存儲過程無法執(zhí)行事務控制語句(也就是commit/rollback)等TCL語句。只有CALL在自己事務中執(zhí)行時,才允許事務控制語句。而我們使用python程序模塊psycopg連接的時候,通常是以begin開始運行的,這就代表了CALL在事務塊中運行,是沒辦法在存儲過程中執(zhí)行commit的。


這一點我們可以再證明一下。再次在存儲過程中增加commit語句,然后運行starttransaction。

可以看到命令行也報了ERROR: invalid transaction termination的錯誤。


那么這個問題如何解決呢?

需要我們在應用程序進行設置,增加conn.autocommit= True,這樣就使用了數(shù)據(jù)庫call中本身的事務,而不是程序在開啟的一層事務。


還需說明一下,在官方文檔是如下介紹的:

Transactioncontrol is only possible in CALL or DO invocationsfrom the top level or nested CALL or DO invocationswithout any other intervening command. For example, if the call stackis CALLproc1() → CALLproc2() → CALLproc3(),then the second and third procedures can perform transaction controlactions. But if the call stack is CALLproc1() → SELECTfunc2() → CALLproc3(),then the last procedure cannot do transaction control, because ofthe SELECT inbetween.


意思是事務控制只能在call或者do從頂層進行調用。在沒有任何其他中間命令的嵌套CALL或DO調用中也能進行事務控制。例如,如果調用棧是CALLproc1() → CALL proc2() → CALLproc3(),那么第二個和第三個過程可以執(zhí)行事務控制動作。但是如果調用棧是CALLproc1() → SELECT func2() → CALLproc3(),則最后一個過程不能做事務控制,因為中間有個SELECT。


以上是我們關于此類事務控制問題的一些小研究。

文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉載請注明本文地址:http://systransis.cn/yun/130157.html

相關文章

  • 深入解析 PostgreSQL 系列之并發(fā)控制事務機制

    摘要:深入解析系列之并發(fā)控制與事務機制并發(fā)控制旨在針對數(shù)據(jù)庫中對事務并行的場景,保證中的一致性與隔離。啟動并執(zhí)行第一個命令。事務管理器分配,并返回事務快照,因為正在進行中。意味著該行由另一個并發(fā)事務更新,并且其事務尚未終止。 showImg(https://segmentfault.com/img/remote/1460000018081793); 深入解析 PostgreSQL 系列整理...

    JohnLui 評論0 收藏0
  • 深入解析 PostgreSQL 系列之并發(fā)控制事務機制

    摘要:深入解析系列之并發(fā)控制與事務機制并發(fā)控制旨在針對數(shù)據(jù)庫中對事務并行的場景,保證中的一致性與隔離。啟動并執(zhí)行第一個命令。事務管理器分配,并返回事務快照,因為正在進行中。意味著該行由另一個并發(fā)事務更新,并且其事務尚未終止。 showImg(https://segmentfault.com/img/remote/1460000018081793); 深入解析 PostgreSQL 系列整理...

    leone 評論0 收藏0
  • PostgreSQL9.6:新增加“idle in transaction”超時空閑事務自動查殺功能

    摘要:以上出自發(fā)行說明,這段指出版本支持自動查殺超過指定時間的空閑事務連接,下面演示下。修改以下參數(shù)備注參數(shù)單位為毫秒,這里設置超時空閑事務時間為秒。數(shù)據(jù)庫日志備注數(shù)據(jù)庫日志里清晰地記錄了進程的連接由于空閑事務超時被斷開連接。 熟悉 PostgreSQL 的朋友應該知道 idle in transaction 進程,引發(fā) idle in transaction 的原因很多,例如應用代碼中忘記...

    meislzhua 評論0 收藏0
  • PostgreSQL筆記

    摘要:事務原子性以下轉賬給要么都成功要么失敗標識符如果打了雙引號整個引號內視為標識符都會被理解為小寫比如標識符其實是被解釋為同一個但是因此建議是總是打引號中的常量用單引號引用不支持的轉義即不能出現(xiàn)字符不代表不能使用四位十六進制六位十六進制如 database cluster: a collection of databases managed by a single PostgreSQL s...

    xcc3641 評論0 收藏0

發(fā)表評論

0條評論

IT那活兒

|高級講師

TA的文章

閱讀更多
最新活動
閱讀需要支付1元查看
<