【发布时间】:2016-09-18 05:07:09
【问题描述】:
更多交易问题!
我现在拥有的是一堆串在一起的查询,如果有任何失败,这些查询都会手动反转:
代码块 1
$stmt1 = $db->prepare(...); // Update table1, set col=col+1
if($stmt1 = $db->execute(...)){
$stmt2 = $db->prepare(...); // Insert into table2, id=12345
if($stmt2 = $db->execute(...)){
$stmt3 = $db->prepare(...); // Select val from table3
if($stmt3 = $db->execute(...)){
$result = $stmt3->fetchAll();
if($result[0]['val'] == something){
$stmt4 = $db->prepare(...); // Update table4, set status=2
if($stmt4 = $db->execute(...)){
return true;
}else{
$stmt1 = $db->prepare(...); // Update table1, set col=col-1 (opposite of above)
$stmt1 = $db->execute(...);
$stmt2 = $db->prepare(...); // Delete from table2, where id=12345 (opposite of above)
$stmt2 = $db->execute(...);
return false;
}
}
return true;
}else{
$stmt1 = $db->prepare(...); // Update table1, set col=col-1 (opposite of above)
$stmt1 = $db->execute(...);
$stmt2 = $db->prepare(...); // Delete from table2, where id=12345 (opposite of above)
$stmt2 = $db->execute(...);
return false;
}
}else{
$stmt1 = $db->prepare(...); // Update table1, set col=col-1 (opposite of above)
$stmt1 = $db->execute(...);
return false;
}
}
这是一团糟,难以调试,难以添加,当查询很大时难以理解,并且如果连接在中途丢失,则不会将所有表恢复到原始状态。
删除一行时,同样的过程更糟糕,因为其中的所有内容都需要存储 - 以防万一操作需要撤消。
现在,我知道大部分在我将其移植到单个事务时仍然可以使用,但我不确定的部分是:
代码块 2
$result = $stmt3->fetchAll();
if($result[0]['val'] == something){
... continue ...
}else{
... reverse operations ...
return false;
}
因为结果收集将在事务中的commit() 之前进行。如下:
代码块 3
$db->beginTransaction();
try{
$stmt1 = $db->prepare(...);
$stmt1->execute();
$stmt2 = $db->prepare(...);
$stmt2->execute();
$stmt3 = $db->prepare(...);
$stmt3->execute();
$result = $stmt3->fetchAll();
if($result[0]['val'] == something){
$stmt4 = $db->prepare(...);
$stmt4->execute();
}else{
$db->rollBack();
return false;
}
$db->commit();
return true;
}catch(Exception $e){
$db->rollBack();
throw $e;
return false;
}
这行得通吗?具体来说,我可以在commit()之前包含$result = $stmt3->fetchAll();before,然后执行条件查询吗?
此外,我对此并不完全确定,但如果在 commit() 之前退出代码 (return false),我是否需要 try 块内的 $db->rollBack();?
【问题讨论】:
标签: php mysql pdo transactions