некоторое время назад я полностью перекодировал свое приложение, чтобы 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, поэтому, когда откат сделан, изменения все еще там.
Теперь я думаю о других битах, которые я бы хотел исключить из транзакции.как отправка почты в моем приложении администратору, чтобы предупредить о проблемах.
Есть ли какой-то способ для меня, чтобы не включать вставку базы данных в родительскую транзакцию?Я выбрал неправильный путь с точки зрения разработки приложений / БД, и есть ли другой способ справиться с этим?
Спасибо, Доминик