は、私は、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
)
私のトランザクションが中断する原因は何ですか?
感謝を!管理者を捜した後、私はkohanaのdbがlast_val()を呼び出していることが分かりました。これは、私がマルチキーテーブルを持っているので失敗します。 –