プログラム内で、仮テーブル上のデータをまるごと本テーブルに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 の違いを意識することのない適当エンジニアです。すみません(^^; 勉強になります!
なるほど~。日頃、SQL と DDL の違いを意識することのない適当エンジニアです。すみません(^^; 勉強になります!
コメントする