Заяц – мой сценарий:
$id = $_GET['id']; $value = $_GET['val']; // database connection here 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(); // is this line of code necessarily ?? } } } else { $error = true; } $db_conn->commit(); } catch(PDOException $e){ $db_conn->rollBack(); }
Как видите, в моем скрипте есть несколько (вложенных) блоков try - catch
. Поэтому я хочу знать, нужен ли какой-либо блок catch
его собственный rollBack()
или я должен просто написать его один раз для всего скрипта?
EDIT: Также как примечание, этот оператор DELETE
действует как отмена . Предположим, вы дали голосование за сообщение, и вы хотите его вернуть. Чтобы оператор DELETE
удалял его, если вы дважды отправляете голосование.