【发布时间】:2016-10-05 03:49:18
【问题描述】:
这是我的脚本:
try{
$db_conn->beginTransaction();
$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 {
$db_conn->rollBack(); -- this
}
}
} else {
$error = true;
}
$db_conn->commit();
}
catch(PDOException $e){
$db_conn->rollBack();
}
如您所见,commit() 之前有一个rollBack()(我已经在 -- this 评论过)。那么我在做什么正确吗?还是说rollBack()没用?
注意:DELETE 语句用作撤消。假设您对某个帖子进行了投票,并且想要收回该帖子。因此,如果您发送两次投票,DELETE 语句将其删除。
【问题讨论】:
-
回滚的全部意义在于,您无需使用删除手动反转插入(回滚为您完成了该操作,这就是“回滚”的意思)......也不需要嵌套 try/catch;只用外面的
-
@MarkBaker “只用外面的”,你在说什么?
try/catch或rollBack()? -
我的意思是只使用一个在异常上回滚的 try/catch 块...摆脱
if ($done){内的那个 try/catch 块 -
@MarkBaker 好吧,我不能......!我必须使用嵌套的 try/catch 来确定重复的 ..!实际上我正在尝试这样做:更新 table1 然后从 table2 插入/删除 .. 插入或删除基于重复。
-
是的,你可以。您已经通过外部尝试捕获了相同的异常。
标签: php mysql pdo transactions