Я делаю транзакцию 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
)
что приводит к прерыванию моей транзакции?