我对交易很陌生。
之前,我在做的事情是这样的:
代码块
$db = new PDO(...);
$stmt = $db->prepare(...);
if($stmt->execute()){
// success
return true;
}else{
// failed
return false;
}
但是为了尝试将多个查询分组到一个交易中,我现在使用的是:
代码块2
$db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
$db->beginTransaction();
try{
$stmt = $db->prepare(... 1 ...);
$stmt->execute();
$stmt = $db->prepare(... 2 ...);
$stmt->execute();
$stmt = $db->prepare(... 3 ...);
$stmt->execute();
$db->commit();
return true;
}catch(Exception $e){
// Failed, maybe write the error to a txt file or something
$db->rollBack();
return false;
}
我的问题是:如果交易因任何原因失败,代码是否会停在$db->commit();
并跳转到catch
块?或者return true;
首先运行,然后它会尝试转到catch
? '因为如果是这样,那么我已经回来了,所以它不会去catch
。它会返回错误的值。
我还需要包含以下内容:
代码块
if($stmt->commit()){
return true;
}
或者我在代码块2
中写的方式是否足够?答案 0 :(得分:3)
如果事务因任何原因失败,代码会在发生错误的行停止结束,然后执行直接跳转到catch块。因此,在代码块2中编写代码就足够了。
请注意,您应该在回滚后始终重新抛出异常。否则您永远不会知道什么是问题。所以它应该是
try{
$stmt = $db->prepare(... 1 ...);
$stmt->execute();
$stmt = $db->prepare(... 2 ...);
$stmt->execute();
$stmt = $db->prepare(... 3 ...);
$stmt->execute();
$db->commit();
return true;
}catch(Exception $e){
$db->rollBack();
throw $e;
}
答案 1 :(得分:1)
抛出异常时停止执行。
将不会达到第一次返回,但会执行catch语句。
您甚至可以直接返回提交:
$dbh->beginTransaction();
try {
// insert/update query
return $dbh->commit();
} catch (PDOException $e) {
$dbh->rollBack();
return false;
}
答案 2 :(得分:0)
如果您遇到任何错误,可以执行此操作以回滚所有此类交易
catch(Exception $e){
$db->rollBack();
// Failed, maybe write the error to a txt file or something
return false;
}