第9章 データベース連携 / 第4回 模擬試験
PHPのトランザクション処理に関する次の記述のうち、正しいものはどれか。
トランザクション中にエラーが発生した場合、`rollBack()`で変更を取り消すことができる。
正解
トランザクションは、複数のSQL文を分離して個別に確定させるための仕組みである。
`commit()`を呼ばなくても、トランザクション内の変更は自動的にデータベースへ反映される。
トランザクションは読み取り専用のSELECT文にのみ使用できる。
解説
トランザクション中にエラーが発生した場合、それまでの一連の変更を`rollBack()`で取り消し、トランザクション開始前の状態に戻すことができます。
他の選択肢が誤りである理由は次の通りです。
・トランザクションは、複数のSQL文を「1つの処理単位としてまとめて」扱う仕組みです。「個別に確定させるため」というのは逆で、複数の操作をひとまとめに確定・取り消しするための仕組みです。
・`beginTransaction()`後の変更は、`commit()`を呼び出すまでデータベースに確定(永続化)されません。「自動的に反映される」は誤りです。
・トランザクションは、`INSERT`/`UPDATE`/`DELETE`のようなデータを変更する操作に対して使われるのが主な用途です。読み取り専用の`SELECT`文だけに限定されるものではありません。
例:
```
try {
$pdo->beginTransaction();
$pdo->exec('UPDATE accounts SET balance = balance - 1000 WHERE id = 1');
$pdo->exec('UPDATE accounts SET balance = balance + 1000 WHERE id = 2');
$pdo->commit();
} catch (Throwable $e) {
$pdo->rollBack();
}
```
(参照: 独習PHP 第4版 第9章 データベース連携 9.8節 トランザクション処理 p.465〜467)