@IT会議室は、ITエンジニアに特化した質問・回答コミュニティ「QA@IT」に生まれ変わりました。ぜひご利用ください。
- PR -

ASP.NET にてトランザクション中のデバッグ中止について

1
投稿者投稿内容
enoshu
会議室デビュー日: 2004/10/01
投稿数: 3
お住まい・勤務地: 東京三鷹
投稿日時: 2004-12-22 10:39
初めて質問致します。いつも参考にさせて頂いていて
リードオンリーですがとても感謝しています。
現在Webフォームの開発を始めたばかりなのですが、
その件でご意見をお聞かせください。

ADO.NET のトランザクションについて動作確認を
している時に生じた疑問です。
下記のようなソースがあってデバッグしていたとします。

(1) ブレークポイントを Commit 文の前の .ExecuteNonQuery() に設定して
(2) ブレークした時点で "VS開発環境" より「デバッグの中止」をして止める。

を行ったとします。
すると下記のソースの2レコード分の挿入が行われているのです。
今までVB(RDO) で開発していたときにはトランザクションが始まってから
コミットの前で中止すれば自動的にロールバックしていたと思います。
これは標準の動きなのでしょうか。

-----------------------------
環境は
Visual Studio 2003 Enter Prise
Windows XP Professional
SQLSERVER 2000
ASP.NET
です。
-----------------------------

private void SqlLocalTransaction()
{
string StrConn = "Server=SERVER01;Database=pubs;Uid=sa;pwd=;

SqlConnection myConnection = new SqlConnection(StrConn);
myConnection.Open();

SqlCommand myCommand = myConnection.CreateCommand();
SqlTransaction myTrans;

// トランザクションをスタート
myTrans = myConnection.BeginTransaction(IsolationLevel.ReadCommitted,"ST");

// コネクションとトランザクションをコマンドオブジェクトにアサイン
myCommand.Connection = myConnection;
myCommand.Transaction = myTrans;

try
{
myCommand.CommandText = "insert into employee(emp_id,fname,lname) values('XXX88888F','Peter','Falk');";
myCommand.ExecuteNonQuery();
myCommand.CommandText = "insert into employee(emp_id,fname,lname) values('XXX99999F','John','Hopkins');";

// ↓** ここにブレークポイントを設定して「デバッグの中止」 をする
myCommand.ExecuteNonQuery();

myTrans.Commit();
}
catch(SqlException e)
{
myTrans.Rollback("ST");
}
finally
{
myConnection.Close();
}
}

burton999
ぬし
会議室デビュー日: 2003/10/06
投稿数: 898
お住まい・勤務地: 東京
投稿日時: 2004-12-22 17:09
標準の動きなのかどうかは分かりませんが、私の環境でもCommitされてしまいますね。。。
クイックウォッチの式のテキストボックスに
myTrans.RollBack()
と打ち込んでから「デバッグの中止」 をすればRollBackされますが、面倒ですね。
きくちゃん
ぬし
会議室デビュー日: 2003/08/01
投稿数: 854
お住まい・勤務地: 都内某所
投稿日時: 2004-12-22 20:24
ASP.NETの場合、「デバッグ」は停止されますが、実行そのものは継続されます。
Jitta
ぬし
会議室デビュー日: 2002/07/05
投稿数: 6267
お住まい・勤務地: 兵庫県・海手
投稿日時: 2004-12-23 06:47
 ASP.NETのプログラムは、aspnet_wp.exeというタスクが実行しています。これはタスクマネージャに表示されますので確認してください。デバッグをするのはこのタスクに対してであって、作ったプログラムが単体で動いているわけではありません(ここ、注意)。

 では、IDEからデバッグ実行をしてみましょう。IEが起動して目的のページが表示されたら、IDEを前に出してツールメニューから[デバッグ→プロセス]を選択します。[デバッグされているプロセス]グループボックスの中を見てください。ここに2つ表示されていると思います。1つはIEで、もう一つはaspnet_wp.exeです。このaspnet_wp.exeをクリックして選択してください。その下のコンボボックスが「このプロセスからでタッチする」に変わりましたね。そうです。「中断」は、プロセスの実行を中断するのではなく、デバッグを中断するだけで、プログラムはその後も動き続けるのです。もう一方のIEは「このプロセスを終了する」なので、中断します。しかし、サーバプロセスは、なくなったIEに対して結果を返すまで、動き続けます。

 これ、デバッグの時に重宝するテクニックです。デバッグ実行すると必ずコンパイルされてしまいますが、[デバッグ→プロセス]からaspnet_wp.exeプロセスにアタッチすると、コンパイルせずにデバッグを開始できます。.aspxファイルなど、保存するだけで反映されるファイルを修正した場合は、この方法でデバッグすると、「構成にエラーがあります」がでる確率がグッと減ります。

 あ、接続文字列の中にAutoCommitとかいうプロパティがあったと思います。それも要注意。

_________________
enoshu
会議室デビュー日: 2004/10/01
投稿数: 3
お住まい・勤務地: 東京三鷹
投稿日時: 2004-12-23 14:17
burton999 さん。
教えて頂いたやり方で目的はかないます。
デバッグの都度、データの状態を手作業で元の状態に戻す
のが大変だな、と思っていたので助かります。
ありがとうございました。

きくちゃん さん。
はい。Jittaさんの説明も併せて読んで初めて知りました。
ありがとうございました。

Jitta さん
詳細な説明、本当に助かります。
VisualStudio の IDE はデバッグを開始すると
コンパイルを行い実行形式のファイルを作成、
それを aspnet_wp.exe が起動して動いている、
という理解で良いのでしょうか。
そうだとするとWebフォームはインタープリタ的に
デバッグを行うわけではないんですね。
たしかにIISが間に絡んでいる訳ですからJittaさんの仰る
>作ったプログラムが単体で動いているわけではありません
というのもわかってきたような気がします。


>[デバッグ→プロセス]からaspnet_wp.exeプロセスにアタッチすると、
> コンパイルせずにデバッグを開始できます
これをこんな感じでやってみたのですが、
(1) なにもしていない状態。
(2) デバッグ -> プロセス から表示される "プロセス"ダイアログで
"選択可能なプロセス" 中の "aspnet_wp.exe" を選択してアタッチボタン。
(3) "プロセスにアタッチ" ダイアログで "Common Language Runtime" をチェックして
OKボタン。
(4) "プロセス" ダイアログ下部の "デバッグされているプロセス" に "aspnet_wp.exe"
が表示されているのを確認して "閉じる" ボタン。

すると確かに開発環境はデバッグ状態のようになっているのですが、
(すべて中断ボタンとか停止ボタンとかが表示されている)
フォームも表示されず、現在どこに止まっているのかもよく
わからないのです。。。

>接続文字列の中にAutoCommitとかいうプロパティがあったと思います。それも要注意
接続文字列に AutoCommit=False などとやってみましたが
[キーワードはサポートされていません ]
となってしまいエラーになってしまいました。
もうちょっと調べてみます。

きくちゃん
ぬし
会議室デビュー日: 2003/08/01
投稿数: 854
お住まい・勤務地: 都内某所
投稿日時: 2004-12-23 14:58
enoshuさん、こんにちは。

引用:

はい。Jittaさんの説明も併せて読んで初めて知りました。


あはは。済みません、何の説明もしてませんでしたね。

引用:

すると確かに開発環境はデバッグ状態のようになっているのですが、
(すべて中断ボタンとか停止ボタンとかが表示されている)
フォームも表示されず、現在どこに止まっているのかもよく
わからないのです。。。


ここで、自分でブラウザを立ち上げて目的のASP.NETアプリケーションにアクセスすれば良いのです。

で、たとえば Page.Load イベントハンドラに

コード:
Response.Write("デバッグ中断");


とだけ記述してブレークポイントを設定し、上記の方法でデバッグしてみて下さい。
この行でブレークしたあと、その行の処理をさせずにそのままデバッグを停止しても、ブラウザにはちゃんと「デバッグ中断」の文字がレスポンスされているのが確認できます。
enoshu
会議室デビュー日: 2004/10/01
投稿数: 3
お住まい・勤務地: 東京三鷹
投稿日時: 2004-12-24 12:07
きくちゃんさん。
返信ありがとうございました。

引用:
------------------------------------------------------------------------
あはは。済みません、何の説明もしてませんでしたね。

いいえ。基本的なところの理解が疎くて。。。



引用:
------------------------------------------------------------------------
ここで、自分でブラウザを立ち上げて目的のASP.NETアプリケーションにアクセス・・・・

やってみて理解できました。
確かにコンパイルせずにデバッグを開始できました。
教えてくださって感謝です。<(_ _)>
1

スキルアップ/キャリアアップ(JOB@IT)