我需要解雇2个查询。目前我这样做:
// Begin Transaction
$this->db->beginTransaction();
// Fire Queries
if($query_one->execute()){
if($query_two->execute()){
// Commit only when both queries executed successfully
$this->db->commit();
}else{
$this->db->rollback();
}
}else{
$this->db->rollback();
}
这是正确的做法吗?我在我的代码中没有使用任何try..catch会使我的代码在任何情况下都不合适或容易受到攻击吗?
答案 0 :(得分:5)
是的,您的方法是正确的。在某些情况下,使用Try...catch
可能会导致更清晰,更易读的代码,但您的整体方法很好。
如果您的代码片段来自处理数据库查询的函数而不是其他函数,我可能会改变方法:
// Begin Transaction
$this->db->beginTransaction();
// Fire Queries
if(!$query_one->execute()){
$this->db->rollback();
// other clean-up goes here
return;
}
if(!$query_two->execute()){
$this->db->rollback();
// other clean-up goes here
return;
}
$this->db->commit();
当然,如果您需要在return
之前完成大量清理工作,那么您的原始方法会更好。特别是在这些情况下,我会研究使用PDO :: ERRMODE_EXCEPTION。这有一些额外的好处,例如异常会自动回滚事务,除非它们被捕获。
答案 1 :(得分:4)
您需要将您的交易包装在try-catch中。大多数情况下,如果抛出异常,那么您的流程无法继续存在错误。你不知道异常的来源,对吧?因此,不要让异常抛出异常并强制应用程序停止,最好抓住它,回滚数据库事务,然后重新抛出它。
// Begin Transaction
$this->db->beginTransaction();
try {
$queryOne->execute();
$queryTwo->execute();
$this->db->commit();
} catch (\Exception $e) {
$this->db->rollback();
throw $e;
}