- PR -

SqlTransactionでINSERTしたデータの更新が出来ない

投稿者投稿内容
未記入
常連さん
会議室デビュー日: 2004/08/26
投稿数: 34
投稿日時: 2004-11-16 11:56
こんにちは
ASP.NET C#で開発しています。
連番を取得するための配番テーブルがあり、
連続で配番しようとした際に、2件目で次のエラーになってしまいます。

SqlException,タイムアウトに達しました。
操作が完了する前にタイムアウト期間が過ぎたか、またはサーバーが応答していません。


以下、ソース

SqlConnection con = new SqlConnection(接続文字列);
con.Open();
tx = con.BeginTransaction();

try
{
//配番テーブルにデータ追加
SqlCommand cmd = new SqlCommand("INSERT INTO 配番テーブル(ID, NO) VALUES(1, 1)", con);
cmd.Transaction = tx;
cmd.ExecuteNonQuery();

//配番テーブルを更新
cmd = new SqlCommand("UPDATE 配番テーブル SET NO = NO + 1 WHERE ID=1", con);
cmd.Transaction = tx;
cmd.ExecuteNonQuery();
}
catch(Exception ex)
{
string msg = ex.Message;
tx.Rollback();
}
finally
{
con.Close();
}



エラーを回避する方法がございましたら
ご教授の程よろしくお願い申し上げます。

burton999
ぬし
会議室デビュー日: 2003/10/06
投稿数: 898
お住まい・勤務地: 東京
投稿日時: 2004-11-16 13:56
初めのInsertがCommitされてないからロックがかかっているのではないでしょうか?
一つのトランザクションで同じレコードに対してInsert、Updateをする理由は何ですか?
未記入
常連さん
会議室デビュー日: 2004/08/26
投稿数: 34
投稿日時: 2004-11-16 15:20
burton999様
ご返答ありがとうございます。

>一つのトランザクションで同じレコードに対してInsert、Updateをする理由は何ですか?

あるテーブルを一括で追加する場合に、何度も配番テーブルを更新するような
作りになっています。

追加したいデータの件数分のループ
{

配番取得処理(配番する番号を取得。配番テーブルのNOを+1して更新)

テーブル追加処理(配番取得処理で取得した番号を用いてデータ追加

}


>初めのInsertがCommitされてないからロックがかかっているのではないでしょうか?
そういうものなのですか・・・。
同じトランザクション内なら出来ると思っていました。
最終的には配番テーブルの番号は最後に設定した値になっていればよいので
作り方を変えます。
ありがとうございました。





えんぞ@?
ぬし
会議室デビュー日: 2004/07/06
投稿数: 271
お住まい・勤務地: はまっこ
投稿日時: 2004-11-16 15:32
引用:

未記入さんの書き込み (2004-11-16 15:20) より:

同じトランザクション内なら出来ると思っていました。


SQL文をCommandTextにセットするようにしては?
# MSDN:BeginTransaction メソッドの使用例を参照
なちゃ
ぬし
会議室デビュー日: 2003/06/11
投稿数: 872
投稿日時: 2004-11-16 15:55
引用:

えんぞ@見習さんの書き込み (2004-11-16 15:32) より:
SQL文をCommandTextにセットするようにしては?


少し補足しておくと、2回目のcmdは新たにnewしているので、トランザクションが分かれちゃってますよ、ということを仰ってるんだと思います。
えんぞ@?
ぬし
会議室デビュー日: 2004/07/06
投稿数: 271
お住まい・勤務地: はまっこ
投稿日時: 2004-11-16 17:00
提示されたソースでもCommit()を追加すれば動きますね。(排他が正しく行われてるかは置いといて)
トランザクションが分かれてるかどうかは、自信持って断言できなかったです。
# しかし、インスタンス作り直すのはなんとなく抵抗が...

本題のエラーについて推測ですが、トランザクション内にて更新後の配番テーブルをSELECTした時にエラーになってるなんてことはありませんか!?
未記入
常連さん
会議室デビュー日: 2004/08/26
投稿数: 34
投稿日時: 2004-11-16 18:36
引用:
--------------------------------------------------------------------------------

本題のエラーについて推測ですが、トランザクション内にて更新後の配番テーブルをSELECTした時にエラーになってるなんてことはありませんか!?
--------------------------------------------------------------------------------

はい、そのようになっていました。
どのように対処したらよいのでしょうか?
ご教授よろしくおねがい申し上げます。


burton999
ぬし
会議室デビュー日: 2003/10/06
投稿数: 898
お住まい・勤務地: 東京
投稿日時: 2004-11-16 18:50
おそらくそのSELECT文もトランザクションに含めるようにすればOKってことだと思います。

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