这是我的剧本:
$id = $_GET['id'];
$value = $_GET['val'];
// database connection here
try{
$db_conn->beginTransaction(); // this
$stm1 = $db_conn->prepare("UPDATE table1 SET col = "updated" WHERE id = ?");
$stm1->execute(array($value));
$done = $stm->rowCount();
if ($done){
try {
$stm2 = $db_conn->prepare("INSERT into table2 (col) VALUES (?)");
$stm2->execute(array($id));
} catch(PDOException $e){
if ((int) $e->getCode() === 23000) { // row is duplicate
$stm3 = $db_conn->prepare("DELETE FROM table2 WHERE col = ?");
$stm3->execute(array($id));
}
}
} else {
$error = true;
}
$db_conn->commit(); // this
}
catch(PDOException $e){
$db_conn->rollBack();
}
首先,我必须说,我的脚本有效。我的意思是结果或它在测试中是预期的。只有一件事吓到我了。我阅读了文件并看到了这句话:
无法工作且危险,因为您可以使用嵌套的commit()过早关闭事务。
我不确定上面句子的含义是什么,我理解也许我不应该在try - catch
和beginTransaction()
之间使用嵌套commit()
。好吧,我说得对吗?这样做很危险吗?
答案 0 :(得分:2)
例外与交易没有直接关系。您可以根据需要在代码中添加任意数量的catch块。
所以你的代码没问题,因为你已经将PDO错误报告设置为例外。