2012-03-14 112 views
4

我使用pg_connect和pg_query一個項目。 但我真的不確定這是否是使用AutoCommit模式的pg_connect?PHP:PGSQL驅動程序和AutoCommit?

是很重要的問題,因爲我需要寫在交易的一些塊,如果語句之一將被服務器忽略,數據庫會出現不一致......

而且有趣的問題是做pg_query執行後提交?

例如:

pg_query('begin; update table1...; update table2...; commit'); 

是相同

pg_query('begin;'); 
pg_query('update table1...;'); 
pg_query('update table2...;'); 
pg_query('commit'); 

,是

pg_query('begin; update table1...; update table2...; commit'); 

在自動提交模式下工作,所以開始和提交仍然是?

感謝您的幫助: DD

回答

8

首先,在PostgreSQL裏沒有自動提交模式和PHP API的功能並不會試圖仿效一個PG_ *。

pg_query的doc

當多個語句傳遞給函數,它們是 作爲一個事務自動執行,除非有明確的 開始/提交包含在查詢字符串命令

所以它保證pg_query("UPDATE1 ..; UPDATE2...")執行一個交易,對數據的全有或全無效果。

序列

pg_query("BEGIN"); 
pg_query("UPDATE1..."); 
pg_query("UPDATE2.."); 
pg_query("COMMIT"); 

相當於pg_query("UPDATE1 ..; UPDATE2...")關於數據完整性(半成品狀態不能發生)。

至於註釋「除非有明確的BEGIN/COMMIT ...」,它是相關的只有這些都不是在SQL語句的整個鏈條的起點和終點。 也就是說,pg_query("BEGIN; update1; update2; COMMIT;");相當於pg_query("update1; update2;")但顯然不等於pg_query("update1; COMMIT; update2;")

+0

那麼這是一個什麼新功能呢? http://www.postgresql.org/docs/9.3/static/ecpg-sql-set-autocommit.html – Eddified 2014-02-15 21:34:10

+0

@Eddified:不,這是老了。 [ECPG(http://www.postgresql.org/docs/current/static/ecpg.html)隱含打開交易,這就是所謂的「autcommit關」。參見[管理事務](http://www.postgresql.org/docs/current/static/ecpg-commands.html#ECPG-TRANSACTIONS) – 2014-02-16 22:10:23

相關問題