【发布时间】:2016-05-20 08:13:38
【问题描述】:
我对交易很陌生。
以前,我在做的是这样的:
代码块 1
$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。而且它会返回错误的值。
我还需要包含以下内容吗:
代码块 3
if($stmt->commit()){
return true;
}
还是按照我在代码块 2 中编写的方式就足够了?
【问题讨论】:
-
是的,如果代码在
$db->commit();处停止,则将返回catch块的输出,因此您无需添加if($stmt->commit()) ....php.net/manual/en/pdo.transactions.php 之类的条件
标签: php mysql pdo transactions