• ベストアンサー

トランザクションモード

早速ご教示ください。 データベース(TEST_db)のM_SYAIN_CDというテーブルがあるとします。 【クエリアナライザ】TEST_db BIGIN TRANSACTION GO DELETE M_SYAIN_CD GO 上記を実行します。 この状態で、M_SYAIN_CDの全行を返すと、『Microsoft odbc sqlserver driver 時間切れになりました』とエラーになり全行返すことができません。 (1)なぜMicrosoft odbc sqlserver driver 時間切れになりました。とな るのか? トランザクションモード中にテーブルは見れないのでしょうか? 【クエリアナライザ】TEST_db BIGIN TRANSACTION GO DELETE M_SYAIN_CD GO COMMIT TRANSACTION GO (2)上記実行後、ROLLBACKはできるのでしょうか? ご教示の程宜しくお願い致します。

質問者が選んだベストアンサー

  • ベストアンサー
  • LegaC2
  • ベストアンサー率52% (224/428)
回答No.1

(1)条件により異なります。 トランザクション中のプロセス内では、Select文は実行できます。 トランザクション中のプロセスとは別プロセス内では、Select文は実行できません。 もう少し正確に言うと、トランザクションモード中でも、テーブルに変更を加える前、ここでは、”Delete M_SYAIN_CD”を実行する前であれば、別プロセスからでもSelect文は実行できます。 理由は、テーブルを変更途中の情報を利用した場合、Commitされればよいですが、Rollbackされると矛盾が発生することになります。 例えば、Aさんが自分の残高0円の通帳にATMで10万円振り込む処理をしている最中、BさんがAさんの通帳をみたら、10万円あったので引き出しました。しかし、Aさんは振込みの処理をキャンセルしたら、Aさんの手元にもBさんの手元にも10万円ずつ残ってしまいます。 そういったことをなくすために、このような仕組みになっています。 (2)Commitした後に、RollBackはできません。

その他の回答 (1)

  • jamshid6
  • ベストアンサー率88% (591/669)
回答No.2

内容はNo1さんの説明の通りですが、質問者さんのオペレーションについて補足します。 >なぜMicrosoft odbc sqlserver driver 時間切れになりました。とな るのか 「全行を返す」というオペレーションをすると、BEGIN TRAN/DELETE文を実行したのとは別のセッションができて、それがSELECTしようとするから見られないのです。 (最初のクエリを実行したセッションがテーブルをロックしているので) BEGIN TRAN/DELETE文を実行した画面と同じ画面でSELECT文を発行すれば中身はみられますよ。

関連するQ&A