Cha*_*kar 0 php mysql pdo commit rollback
我需要触发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();
}
Run Code Online (Sandbox Code Playgroud)
这是正确的方法吗?我在代码中没有使用try..catch,这会使我的代码在任何情况下都不适当或容易受到攻击吗?
是的,您的方法是正确的。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();
Run Code Online (Sandbox Code Playgroud)
当然,如果您需要先进行大量清理return,那么原始方法会更好。特别是在这些情况下,我会考虑使用PDO :: ERRMODE_EXCEPTION。这还有一些其他好处,例如,除非被捕获,否则异常会自动回滚事务。
您需要将交易包装在 try-catch 中。大多数情况下,如果抛出异常,则说明您的流程无法继续。你不知道异常会从哪里来,对吧?因此,与其让异常疯狂抛出并强制应用程序停止,不如捕获它,回滚数据库事务,然后重新抛出它。
// Begin Transaction
$this->db->beginTransaction();
try {
$queryOne->execute();
$queryTwo->execute();
$this->db->commit();
} catch (\Exception $e) {
$this->db->rollback();
throw $e;
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
5587 次 |
| 最近记录: |