Разработка программ PHP и MySQL ACID - PullRequest
1 голос
/ 11 июля 2011

некоторое время назад я полностью перекодировал свое приложение, чтобы MySQL работал ACID.

На самом верхнем уровне всех функций я делаю что-то вроде этого:

        try{
            $db->begin();
            dosomething($_SESSION['userid']);
            $db->commit();
        }catch(advException $e){
            $eCode = $e->getCode();
            $eMessage = $e->getMessage();
            # Success
            if ($eCode == 0){
                $db->commit();
            }else{
                $db->rollback();
            }
        }

В функции 'dosomething' у меня есть исключения, выдаваемые пользователям, например:

throw new Exception('There was a problem.',1);

или

throw new Exception('You have successfully done that!', 0);

, чтобы я мог контролировать ход программы.Если есть проблема, то откатите все, что произошло, и если все было хорошо, то совершите это.Все это работало довольно хорошо, но есть только один недостаток, с которым я столкнулся до сих пор.Я добавил журналы исключений, чтобы видеть, когда возникают проблемы, с которыми сталкиваются пользователи.Но проблема в том, что если таблица, в которой регистрируются ошибки, - это InnoDB, то она также включается в транзакцию и откатывается, если возникает проблема, поэтому ошибки не сохраняются.Чтобы обойти это, я просто создал таблицу регистрации ошибок MyISAM, поэтому, когда откат сделан, изменения все еще там.

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

Есть ли какой-то способ для меня, чтобы не включать вставку базы данных в родительскую транзакцию?Я выбрал неправильный путь с точки зрения разработки приложений / БД, и есть ли другой способ справиться с этим?

Спасибо, Доминик

Ответы [ 2 ]

3 голосов
/ 11 июля 2011

Не следует создавать исключение при успешном завершении.

Вы должны выполнить вставку БД после вызова предыдущего отката.

catch (Exception $e) {
  $db->rollback();
  Log::insert('Error: ' . $e->getMessage());
}

Попробуйте использовать Logger для управления вашей программой,Это более гибкий способ.

0 голосов
/ 12 июля 2011

Используйте коды возврата для успешной работы и Исключения для указания исключительных ситуаций (таких как серьезные ошибки и т. Д.). Что касается вашей конкретной проблемы, я бы рекомендовал иметь отдельную базу данных для ведения журнала, если вы решите использовать стратегию отката.

...