2012-03-14 2 views
4

프로젝트에서 pg_connect 및 pg_query를 사용합니다. 하지만 pg_connect가 AutoCommit 모드를 사용하는지 확실치 않습니까?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 여러 문이 함수에 전달되는

, 그들은 명시가없는 한 가/BEGIN 쿼리 문자열에 포함 된 명령을 COMMIT, 자동으로 하나의 트랜잭션으로 실행 말합니다

따라서 하나의 트랜잭션에서 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

+0

@Edified : 아니요, 오래된 것입니다. [ECPG] (http://www.postgresql.org/docs/current/static/ecpg.html)는 암시 적으로 트랜잭션을 열고 "autcommit off"라고합니다. [트랜잭션 관리] (http://www.postgresql.org/docs/current/static/ecpg-commands.html#ECPG-TRANSACTIONS)를 참조하십시오. –

관련 문제