前一阵子我完全重新编码我的应用程序,这样的MySQL将在酸的方式进行。PHP和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,所以当回滚完成时,更改仍然存在。
现在,我想我想保持了交易的,像我的应用程序中发送邮件给管理员,帮助有问题的警告其他位。
有什么样的办法,我不包括父事务中的数据库插入?我是否在应用程序/数据库设计方面走了一条糟糕的路线,有没有其他办法可以处理?
谢谢,多米尼克
你为什么在成功时抛出异常? –
您可以始终拥有另一个DB句柄来执行日志记录,这会使日志部分独立于主句柄中的事务处理,但是您需要在日志记录系统中记录异常,所以您最终会记录您的日志记录,并且会令人厌恶。 –
我的扩展异常类处理异常编号。如果异常代码是0,那么它是成功的。我认为这是退出代码并保持一致性的好方法。我猜如果我只是回来'你已经成功地做到了!';然后,我不需要检查在Exception catch中提交的eCode。 –