2011-08-09 1 views
1

は、私は、PostgreSQL 9.0私のSQLトランザクションがPHPに気づかずに中止する原因は何ですか?

とPHPにKohanaの3.2フレームワークからSQLトランザクションをやっている私は、私は、これは、いくつかのSQLはこの1つが失敗したため、前のように私には意味奇妙なので例外

Database_Exception [ 0 ]: ERROR: current transaction is aborted, commands ignored until end of transaction block [ SELECT c.* FROM contents c WHERE c.content_id = 129 AND EXISTS(SELECT NULL FROM contents tmp WHERE tmp.content_id = c.content_id AND c.content_id = 129 GROUP BY tmp.content_id HAVING MAX(tmp.version) = c.version) ]

に取得しますこれ以上のSQL文は受け入れられません。しかし、私はtry/catchブロックですべての自分のSQLコールを持っており、再スローする前にcatchでロールバックを行います。

ので、私はで開始するトランザクションを台無しにしていると思われる、前1を見ることを期待する代わりに?、右のこの例外を見ることはないはずです...

私はPHP DBドライバへのロギングを追加、およびログイン問題につながるSQLステートメントに従います。以下の最後のSELECTステートメントは、上記の例外で参照されているステートメントです。

例外ステートメントの前のステートメントは、スポイラーの候補となるINSERTですが、これらのステートメントをすべて手作業で実行すると、すべて正しく処理されます。

UPDATE "articles" 
SET article_id = 126, title = 'abc', blurb = 'abc article blurb' 
WHERE "article_id" = 126 

SELECT c.* FROM contents c 
WHERE c.content_id = 127 
AND EXISTS( 
    SELECT NULL FROM contents tmp 
    WHERE tmp.content_id = c.content_id AND c.content_id = 127 
    GROUP BY tmp.content_id HAVING MAX(tmp.version) = c.version 
) 

SELECT c.* FROM contents c 
WHERE c.content_id = 128 AND EXISTS( 
    SELECT NULL FROM contents tmp 
    WHERE tmp.content_id = c.content_id AND c.content_id = 128 
    GROUP BY tmp.content_id HAVING MAX(tmp.version) = c.version 
) 

INSERT INTO "contents" 
("blurb", "content", "content_id", "content_type_id", "title", "author_id", "version", "editor_id") 
VALUES 
('postit art', 'FEATURE_IMG_david-chan-drawing_IMG_0221.JPG', 128, 2, 'david chan drawing', 5, 2, 4) 

SELECT c.* FROM contents c 
WHERE c.content_id = 129 AND EXISTS( 
    SELECT NULL FROM contents tmp 
    WHERE tmp.content_id = c.content_id AND c.content_id = 129 
    GROUP BY tmp.content_id HAVING MAX(tmp.version) = c.version 
) 

私のトランザクションが中断する原因は何ですか?

答えて

2

PostgreSQLサーバ自体は、トランザクションのエラーを引き起こしたSQLとともに、スレッドの別の終了を提供するのに役立つかもしれないエラーをログに記録します。

あなたは、データベースが異なるタスクの多くを行う場合は、あなたのクライアントを選ぶ手助けするlog_line_prefixを定義する必要があるかもしれません(例えばlog_line_prefix = '%t %c %q%[email protected]%h:%d 'のようなSTH)

+0

感謝を!管理者を捜した後、私はkohanaのdbがlast_val()を呼び出していることが分かりました。これは、私がマルチキーテーブルを持っているので失敗します。 –

関連する問題