什么导致我的SQL事务中止而没有php注意到?

时间:2011-08-09 21:42:17

标签: php sql postgresql kohana kohana-3

我正在使用Postgresql 9.0从PHP中的kohana 3.2框架进行SQL事务

我得到了一个例外

  

Database_Exception [0]:错误:当前事务被中止,   命令被忽略,直到事务块结束[SELECT c。* FROM   内容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失败了,因此不再接受SQL语句。但是我在try / catch块中进行了所有SQL调用,并在重新抛出之前对catch执行回滚。

所以我永远不应该看到这个异常吗?而是希望看到之前的那个,这会破坏交易开始......

我在我的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 
 ) 

是什么导致我的交易中止?

1 个答案:

答案 0 :(得分:2)

PostgreSQL服务器本身会记录事务中的错误以及导致它们的SQL,这可能有助于提供线程的另一端来获取吗?

如果数据库执行了很多不同的任务(例如...... log_line_prefix),您可能需要定义log_line_prefix = '%t %c %q%u@%h:%d '来帮助您挑选客户端