- - PR -
SqlTransactionでINSERTしたデータの更新が出来ない
投稿者 | 投稿内容 | ||||
---|---|---|---|---|---|
|
投稿日時: 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(); } エラーを回避する方法がございましたら ご教授の程よろしくお願い申し上げます。 | ||||
|
投稿日時: 2004-11-16 13:56
初めのInsertがCommitされてないからロックがかかっているのではないでしょうか?
一つのトランザクションで同じレコードに対してInsert、Updateをする理由は何ですか? | ||||
|
投稿日時: 2004-11-16 15:20
burton999様
ご返答ありがとうございます。 >一つのトランザクションで同じレコードに対してInsert、Updateをする理由は何ですか? あるテーブルを一括で追加する場合に、何度も配番テーブルを更新するような 作りになっています。 追加したいデータの件数分のループ { 配番取得処理(配番する番号を取得。配番テーブルのNOを+1して更新) テーブル追加処理(配番取得処理で取得した番号を用いてデータ追加 } >初めのInsertがCommitされてないからロックがかかっているのではないでしょうか? そういうものなのですか・・・。 同じトランザクション内なら出来ると思っていました。 最終的には配番テーブルの番号は最後に設定した値になっていればよいので 作り方を変えます。 ありがとうございました。 | ||||
|
投稿日時: 2004-11-16 15:32
SQL文をCommandTextにセットするようにしては? # MSDN:BeginTransaction メソッドの使用例を参照 | ||||
|
投稿日時: 2004-11-16 15:55
少し補足しておくと、2回目のcmdは新たにnewしているので、トランザクションが分かれちゃってますよ、ということを仰ってるんだと思います。 | ||||
|
投稿日時: 2004-11-16 17:00
提示されたソースでもCommit()を追加すれば動きますね。(排他が正しく行われてるかは置いといて)
トランザクションが分かれてるかどうかは、自信持って断言できなかったです。 # しかし、インスタンス作り直すのはなんとなく抵抗が... 本題のエラーについて推測ですが、トランザクション内にて更新後の配番テーブルをSELECTした時にエラーになってるなんてことはありませんか!? | ||||
|
投稿日時: 2004-11-16 18:36
引用:
-------------------------------------------------------------------------------- 本題のエラーについて推測ですが、トランザクション内にて更新後の配番テーブルをSELECTした時にエラーになってるなんてことはありませんか!? -------------------------------------------------------------------------------- はい、そのようになっていました。 どのように対処したらよいのでしょうか? ご教授よろしくおねがい申し上げます。 | ||||
|
投稿日時: 2004-11-16 18:50
おそらくそのSELECT文もトランザクションに含めるようにすればOKってことだと思います。
|