Php PDO多查询:提交和回滚事务
我需要提出两个问题。目前我是这样做的:Php PDO多查询:提交和回滚事务,php,mysql,pdo,commit,rollback,Php,Mysql,Pdo,Commit,Rollback,我需要提出两个问题。目前我是这样做的: // Begin Transaction $this->db->beginTransaction(); // Fire Queries if($query_one->execute()){ if($query_two->execute()){ // Commit only when both queries executed successfully $this->db->co
// 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,这会使我的代码在任何情况下都不合适或易受攻击吗?您需要将事务包装在try-catch中。大多数情况下,如果抛出异常,则流程将无法继续。你不知道例外会从哪里来,对吗?因此,与其让异常大量抛出并强制应用程序停止,不如捕获它,回滚数据库事务,然后重新抛出它
// Begin Transaction
$this->db->beginTransaction();
try {
$queryOne->execute();
$queryTwo->execute();
$this->db->commit();
} catch (\Exception $e) {
$this->db->rollback();
throw $e;
}
您需要将事务包装在try-catch中。大多数情况下,如果抛出异常,则流程将无法继续。你不知道例外会从哪里来,对吗?因此,与其让异常大量抛出并强制应用程序停止,不如捕获它,回滚数据库事务,然后重新抛出它
// Begin Transaction
$this->db->beginTransaction();
try {
$queryOne->execute();
$queryTwo->execute();
$this->db->commit();
} catch (\Exception $e) {
$this->db->rollback();
throw $e;
}
是的,你的方法是正确的。在某些情况下,使用
Try…catch
可能会生成更干净、可读性更强的代码,但您的总体方法是不错的
如果您的代码片段来自处理DB查询的函数,而不是其他函数,我可能会改变这种方法:
// 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();
当然,如果在返回
之前需要进行大量清理,那么您原来的方法会更好。特别是在这些情况下,我将研究如何使用PDO::ERRMODE_异常。这还有一些额外的好处,比如异常自动回滚事务,除非它们被捕获。是的,您的方法是正确的。在某些情况下,使用Try…catch
可能会生成更干净、可读性更强的代码,但您的总体方法是不错的
如果您的代码片段来自处理DB查询的函数,而不是其他函数,我可能会改变这种方法:
// 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();
当然,如果在返回之前需要进行大量清理,那么您原来的方法会更好。特别是在这些情况下,我将研究如何使用PDO::ERRMODE_异常。这还有一些额外的好处,比如异常自动回滚事务,除非它们被捕获。需要吗?“怎么会更好?”YourCommonSense我编辑了我的答案,给出了更详细的解释。但这并没有让他的代码变得更好。为了方便起见,可以使用事务,但这不是必需的。可以使用完全相同的结果检查执行结果。异常不会独占检查查询结果。而OP基本上是问他是否可以不带他们继续生活。所以,这个答案对于给出的问题来说是误导性的。@YourCommonSense我不同意,安迪的答案对我来说更有意义。如果你有10个问题呢?放下那些“如果”去做交易吧,安迪的成语很好。当你说“异常不会垄断检查查询结果”时,你是对的,它们只是更安全(即使是从开发人员的角度来看,也没有异常会越过这样的习惯用法,而如果你重构一些代码而忘记了if-else…boom:))。你需要什么?“怎么会更好?”YourCommonSense我编辑了我的答案,给出了更详细的解释。但这并没有让他的代码变得更好。为了方便起见,可以使用事务,但这不是必需的。可以使用完全相同的结果检查执行结果。异常不会独占检查查询结果。而OP基本上是问他是否可以不带他们继续生活。所以,这个答案对于给出的问题来说是误导性的。@YourCommonSense我不同意,安迪的答案对我来说更有意义。如果你有10个问题呢?放下那些“如果”去做交易吧,安迪的成语很好。当你说“异常不会垄断检查查询结果”时,你是对的,它们只是更安全(即使是从开发人员的角度来看,也没有异常会越过这样的习惯用法,而如果你重构一些代码而忘记了if-else…boom:))。向上投票