SnowPro Advanced: Data Engineer 無料問題 8 / 10 ・ 分野5: Data Transformation
手続きの中で BEGIN TRANSACTION のあと、表 A へ INSERT し、作業用の表を CREATE TABLE で作り、表 B へ INSERT した。表 B への INSERT が失敗したので ROLLBACK した。表 A に入れた行はどうなるか。
- 取り消される。ROLLBACK は CREATE TABLE も含め、BEGIN TRANSACTION 以降の文を取り消すため
- 取り消される。表 B への INSERT が失敗すると、トランザクション全体が取り消されるため
- 残る。AUTOCOMMIT が既定で TRUE なので、明示的なトランザクションの中の各文も確定するため
- 残る。CREATE TABLE が実行前に暗に COMMIT し、A の INSERT が確定したため
正解と解説を見る
正解: D
正解の理由
DDL 文はそれぞれ別のトランザクションとして実行される。トランザクションが有効な間に DDL を実行すると、DDL は (1) 有効なトランザクションを暗に COMMIT し、(2) 自分を別のトランザクションとして実行する。そのため BEGIN TRANSACTION のあとに CREATE TABLE を置くと、それまでの表 A への INSERT はその時点で確定し、あとの ROLLBACK では取り消されない。DDL のすぐ後の DML は、新しいトランザクションを暗に始める。公式が、明示的なトランザクションには DML と問い合わせだけを入れるよう勧めているのはこのためである。
違う選択肢
「取り消される。ROLLBACK は CREATE TABLE も含め、BEGIN TRANSACTION 以降の文を取り消すため」… ROLLBACK が取り消すのは、まだ確定していないトランザクションの文である。表 A への INSERT は CREATE TABLE の前の暗の COMMIT で確定済みなので、取り消されない。DDL は自分がトランザクションなので、CREATE TABLE も ROLLBACK では取り消せない。
「取り消される。表 B への INSERT が失敗すると、トランザクション全体が取り消されるため」… トランザクションの中で文が失敗しても、トランザクション全体が自動で取り消されるわけではなく、残りを確定することもできる。しかも表 A の INSERT は CREATE TABLE の時点で確定している。
「残る。AUTOCOMMIT が既定で TRUE なので、明示的なトランザクションの中の各文も確定するため」… 明示的なトランザクションの中の文は AUTOCOMMIT の影響を受けない。表 A の行が残るのは AUTOCOMMIT のためではなく、DDL の前の暗の COMMIT のためである。
手続きでの注意
AUTOCOMMIT の設定は手続きの中で変えない。AUTOCOMMIT を無効にしているとき、手続きの終わりで有効なままのトランザクションは暗に ROLLBACK される。DDL は自分がトランザクションなので、DDL 自体を ROLLBACK で取り消すことはできない。