はここに私のスクリプトです:すべてのPDOトランザクションにtry catch例外を使用できますか?
$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()を使用してトランザクションを早く終了する可能性があるため、動作しない可能性があり危険です。
私はちょうど私が私がbeginTransaction()
とcommit()
の間でネストされたtry - catch
を使用してはならない多分理解し、上記の文の意味が何かわかりません。まあ、私はそれが正しい?それは危険ですか?
ドキュメントにはどこですか? – Phil
トランザクションを使用している場合、エラー時にレコードを削除する必要はありません。ロールバックするだけです。文はtry/catchについてではなく、 'beginTransaction()'/'commit()'のネストに関するものです。 .. – n00dl3
@Phil http://php.net/manual/en/pdo.begintransaction.php – stack