что вызывает мою транзакцию SQL, чтобы прервать, не замечая php? - PullRequest
1 голос
/ 10 августа 2011

Я делаю транзакцию SQL из фреймворка Kohana 3.2 в PHP с Postgresql 9.0

Я получаю исключение

Database_Exception [0]: ОШИБКА: текущая транзакция прервана, команды игнорируются до конца блока транзакции [SELECT c. * FROM содержимое c ГДЕ c.content_id = 129 И СУЩЕСТВУЕТ (ВЫБЕРИТЕ NULL ИЗ содержимое 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 больше не принимаются. Однако у меня есть все вызовы SQL в блоке try / 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 Ответ

2 голосов
/ 10 августа 2011

Сам сервер PostgreSQL будет регистрировать ошибки в транзакциях вместе с вызывающим их SQL, что может помочь обеспечить другой конец потока для получения?

Возможно, вам потребуется определить log_line_prefixчтобы помочь вам выбрать клиента, если база данных выполняет много разных задач (например, например, log_line_prefix = '%t %c %q%u@%h:%d ')

...