なぜ、「このトランザクションは完了しています」になるのか?[データベース]
(2022-02-14 11:32:38) by shinoda


プログラム内で、仮テーブル上のデータをまるごと本テーブルにINSERTする処理があって、特になんの編集もなく突っ込むだけだから、

SELECT * INTO hon_tbl FROM kari_tbl

みたいな SQL を書いてたわけよ。(DBMS は SQL Server です)

そしたら、(もちろんこのSQL以外にもいくつかのフラグの更新SQLなどが流れているのでトランザクション処理をしてるんだけど)Roolback のときも Commit のときも、

System.InvalidOperationException: 'この SqlTransaction は完了しています。再度使用することはできません。'

という例外が発生する。
SELECT INTO すると、勝手に Commit されちゃうの???謎〜

「SELECT INTO するのならトランザクション処理は必要なかろう」という乱暴な意見もありそうだが、いやいや、やっぱおかしいやろう。

トランザクション処理はなるべく範囲を小さく・・・は基本だが、いくつかのテーブルを更新してから Commit なんて普通のことで、いくらなんでも SELECT INTO したからトランザクション終わり!ってもんではない。

結局、1件ずつ INSERT 文を発行する形に直したが、なんか納得いかんなあ

そういうもんなの???>SQL Server に詳しい人!

<追記>
すぐに SNS で偉い人が「SELECT INTO は SQL ではなく DDL 扱いじゃないか?INSERT INTO SELECT ならトランザクション内として処理されるはず」とアドバイスをくださった。
なるほど〜。日頃、SQL と DDL の違いを意識することのない適当エンジニアです。すみません(^^; 勉強になります!

コメント投稿
次の記事へ >
< 前の記事へ
TOPへ戻る

Powered by
MT4i 3.0.8