電気ウナギ的○○

About Home

なぜ、「このトランザクションは完了しています」になるのか?

shinoda (2022年2月14日 11:32)
プログラム内で、仮テーブル上のデータをまるごと本テーブルに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 の違いを意識することのない適当エンジニアです。すみません(^^; 勉強になります!

電気ウナギ的○○

電気ウナギ的○○

About Back

コメント(0)

電気ウナギ的○○

電気ウナギ的○○

About Back

トラックバック(0)

トラックバックURL: https://blog.netandfield.com/mt/mt-tb.cgi/6169

電気ウナギ的○○

About This Site

電気ウナギ的○○
岩国在住。広島で働く超零細IT企業社長のいわゆる社長日記。
何か、酒と食い物のことばかり書いているようで・・・お察しのとおり、肥満体です:-)


2011/06/24
iPhone用サイト公開

Create with jQuery, jQTouch.


CLOSE