Декларативные сделки для Кохана? - PullRequest
1 голос
/ 01 марта 2012

Я недавно начал работать над приложением, основанным на платформе Kohana, которое разрабатывалось в течение нескольких месяцев, и код не использует транзакции с БД.Из-за этого я уже видел повреждение данных.

Выполнение всего кода для добавления транзакций вручную было бы длительной и подверженной ошибкам задачей, поэтому я планирую реализовать что-то вроде декларативных транзакций в JavaПлатформы EE и Spring: просто оберните каждое действие контроллера в транзакцию БД, используя функции before () и after () суперкласса контроллера для конкретного проекта.Может быть, сделать его настраиваемым через переопределяемое свойство, содержащее имена действий, требующих транзакции.

  1. Было ли это сделано ранее многократно?
  2. Как я могу иметь дело с исключениями?Вызывается ли after () при возникновении исключения?Если так, как я могу узнать, было ли выброшено исключение?Если нет, как еще я могу на них реагировать?

Ответы [ 2 ]

1 голос
/ 01 марта 2012

Не похоже, что в Kohanas ORM есть поддержка транзакций, но вы все равно можете делать вызовы вручную

$db->query("START TRANSACTION");
$db->query(query1);
$db->query(query2);
$db->query("COMMIT");

Я посмотрел, и кажется, что метод after не вызывается, если есть исключение, если вы заглянули в здесь и искали «после», вы попадаете в какой-то код, где вы видите, что оператор catch не запускает метод after ().

Я действительно неуверен, что, как вы можете сделать его глобальным без других компромиссов ...

0 голосов
/ 13 марта 2012

Использование функций before() и after() базового класса контроллера работало во многих случаях, но мне было неловко не делать явного отката при работе с исключениями.Затем я обнаружил, что я также получал неявный откат всякий раз, когда действие, называемое Request::current()->redirect(), потому что эта функция выполняет exit, поэтому after() никогда не вызывается.

Мое новое и улучшенное решение - переопределить код KohanaЗапросите класс, и я создаю модуль Кохана , чтобы каждый мог его легко использовать:

https://github.com/brazzy/kohana-transactional

...