- PR -

WEBサービス内のレコード追加処理で

1
投稿者投稿内容
まゆりん
ぬし
会議室デビュー日: 2002/08/12
投稿数: 539
お住まい・勤務地: よこはま
投稿日時: 2002-08-24 16:52
いつも参考にさせて頂いております。

■環境
OS:Win2K SP2
DB:Oracle8i
VB.NETを使用

現在WEBサービスを作成しておりまして、
主にテーブル処理を行っております。

そこでINSERT文をExecuteNonQueryで投げているのですが、
INSERTが成功するとそれ以降の処理ができない状態になってしまいます。
(ブラウザの青いゲージが真ん中くらいで止まったまま)
失敗した場合はすぐに戻り値が返ってくるのですが・・・。
あれこれとSQLをいじってみたものの、どれも同じ結果でした。

この場合に考えられる原因が分かれば直せそうなので、
同じような状況を経験された方などの助言が頂きたいです。
宜しくお願い致します。
うりゅう
大ベテラン
会議室デビュー日: 2002/06/15
投稿数: 202
お住まい・勤務地: Hiroshima
投稿日時: 2002-08-24 18:57
こんにちは。まゆりんさん。

>そこでINSERT文をExecuteNonQueryで投げているのですが、
>INSERTが成功するとそれ以降の処理ができない状態になってしまいます。

何行分くらい投げられていますか?
_________________
--------------------------------------
ネットビルド 小田原貴樹
odahara@netbuiuld.jp
--------------------------------------
まゆりん
ぬし
会議室デビュー日: 2002/08/12
投稿数: 539
お住まい・勤務地: よこはま
投稿日時: 2002-08-24 19:34
うりゅう様

お返事有難うございます。
投げている行数は1行だけなんです。
それだけでレスポンスが遅くなるなんて・・・。

ちなみに、今もぐりぐりといじってたのですが
上手く追加される時と止まってしまう時があるので、
トランザクションに問題があるのではと思い、更に調べています。

#トランザクションを開始したら、
CommitかRollbackで終了させなければならないんですよね?
(すみません・・・DB関連には疎いもので・・・)
うりゅう
大ベテラン
会議室デビュー日: 2002/06/15
投稿数: 202
お住まい・勤務地: Hiroshima
投稿日時: 2002-08-25 07:39
>投げている行数は1行だけなんです。
>それだけでレスポンスが遅くなるなんて・・・。

それは、レスポンスが遅いというより処理が戻ってきてませんね。おそらく。

>#トランザクションを開始したら、
>CommitかRollbackで終了させなければならないんですよね?
>(すみません・・・DB関連には疎いもので・・・)

僕はずっとDBの仕事をやってますが、私見として、特別な場合をのぞいて「Commit・Rollback」などのトランザクションを使うべきではないと考えています。

どうしてもトランザクション処理を使う必要がないのであれば、単純なInsert構文を使ってみられた方がいいと思うのですが。(反論多そうだなぁ(苦笑))
_________________
--------------------------------------
ネットビルド 小田原貴樹
odahara@netbuiuld.jp
--------------------------------------
まゆりん
ぬし
会議室デビュー日: 2002/08/12
投稿数: 539
お住まい・勤務地: よこはま
投稿日時: 2002-08-25 16:10
おつかれさまです、今日も休日出勤のまゆりんです(^^;

>僕はずっとDBの仕事をやってますが、私見として、特別な場合をのぞいて「Commit・>Rollback」などのトランザクションを使うべきではないと考えています。

「特別な場合」というのは、複数のクライアントから同時にアクセスされる
テーブルへ更新などを行う場合ということですか?
もしくは、複数のSQLを同時に更新したい場合とか・・・?

>どうしてもトランザクション処理を使う必要がないのであれば、単純なInsert構文を使ってみ>られた方がいいと思うのですが。(反論多そうだなぁ(苦笑))

以前ASPやVB6.0でガリガリ作ってた時に、「UPDATEとINSERTの時にはトランザクションが必要」
という固定観念を持っていたので、(正確には、先輩にそう洗脳されてた(笑))
トランザクションを使わない方法というのが私にはちょっと分かりません。
もし宜しければその辺をもう少しご教授願えればと思っております。
このような知識の薄い者で申し訳ございませんが、宜しくお願い致します。
うりゅう
大ベテラン
会議室デビュー日: 2002/06/15
投稿数: 202
お住まい・勤務地: Hiroshima
投稿日時: 2002-08-26 13:31
うりゅうです。

>という固定観念を持っていたので、(正確には、先輩にそう洗脳されてた(笑))

 DBの更新系処理に必ずトランザクションが必要だと言われる方は、レガシー(旧来)なDBを触ってらっしゃた方に多いように思えます。

 現在のSQL ServerやOracleなどには、トランザクションを使わなくてもいいようにするための機能が実装されています。(Oracleのことはそれほど詳しくないのですが(苦笑))

>「特別な場合」というのは、複数のクライアントから同時にアクセスされる
>テーブルへ更新などを行う場合ということですか?

 こうした場合に複数同時書き込みによる不整合なデータを作らないために「ロック処理(もしくはロッキング)」という機能が搭載されています。現在は行レベルロッキングなど柔軟で強力なロック処理が自動的にかかるようになっています。

 また、特にUPDATE等で、複数行の一括更新を行う際に、書き換え途中でなにかしらのトラブルが発生し最後まで処理が終了しなかった場合にも、「自動トランザクション」という機能で、更新そのものが行われなかったという事になります。

>もしくは、複数のSQLを同時に更新したい場合とか・・・?

 では、トランザクションを使わなければならない場合というのはどういう場合なのか(というか僕が考えているか)は、まゆりんさんのおっしゃるとおりストアドプロシージャやプログラムなどで、「一連のSQLが連動して処理されなければならない更新処理」を行う場合だといえます。預金口座の処理などが代表的です。

すなわち複数の意味合いの異なるデータを一括して更新するバッチ処理の場合だといえます。

>トランザクションを使わない方法というのが私にはちょっと分かりません。

えーと、SQL的には単純にINSERT・UPDATEをトランザクション命令無しに単文で実行すればトランザクションは使われません。

 また、ADO.NETで搭載されたDataSetの概念などはそのものがトランザクションだといえますので、DataSetを使う限りにおいては、SQLレベルのトランザクション処理は(ほぼ)まったく必要ないといえると思います。

 これも私見にすぎませんが、DBサーバソフトが自身で自動的なトランザクション処理を内包したり、ADO.NETでトランザクション処理の必要性を軽減したりという背景の中には、「トランザクション」のコーディングの複雑さがあると思われます。その存在理由ゆえにトランザクション処理は厳しいコーディング制約になっていると思います。ちょっとしたミスでも動かないというような。また、プログラムから見れば外部の処理なのでエラーがあっても直接結果が戻ってこずプログラムのハングアップという自体を引き起こしやすいのも現実です。

 なので、トランザクションはむやみに使わない方がいいというふうに僕は考えています。
_________________
--------------------------------------
ネットビルド 小田原貴樹
odahara@netbuiuld.jp
--------------------------------------
まゆりん
ぬし
会議室デビュー日: 2002/08/12
投稿数: 539
お住まい・勤務地: よこはま
投稿日時: 2002-08-29 12:37
うりゅうさん、こんにちは。
お返事が遅くなってしまい申し訳ございません。

>DBの更新系処理に必ずトランザクションが必要だと言われる方は、
>レガシー(旧来)なDBを触ってらっしゃた方に多いように思えます。
レガシー=Olacle7以前ってことですかね?
だとしたら、うりゅうさんのおっしゃる通りだと思います。

トランザクションを使用しなくてもいい機能や、ロッキング機能なんて
正直知りませんでしたので、今後のためにもこのような機能を使えるよう
勉強していきたいと思います。

>すなわち複数の意味合いの異なるデータを一括して更新するバッチ処理の場合だといえます。
今回私がこちらでご質問させて頂いたSQLは単体で発行すると申し上げましたが、
その後仕様が変わりましてもう一つ別のテーブルへINSERTする処理も同時に行いたい
・・・とのことでしたので、結局トランザクションは使用することにしました。

>これも私見にすぎませんが、DBサーバソフトが自身で自動的なトランザクション処理を
>内包したり、ADO.NETでトランザクション処理の必要性を軽減したりという背景の中には、
>「トランザクション」のコーディングの複雑さがあると思われます。
>その存在理由ゆえにトランザクション処理は厳しいコーディング制約になっていると
>思います。ちょっとしたミスでも動かないというような。また、プログラムから見れば
>外部の処理なのでエラーがあっても直接結果が戻ってこずプログラムのハングアップという
>自体を引き起こしやすいのも現実です。

確かに、ASPの頃はトランザクションで何度泣かされたことでしょうか(苦笑)。
それがプログラム側で意識しなくても良いのであれば、かなり開発が楽になるような気がしますね。

とても参考になるご意見を頂きまして大変良い勉強になりました。
本当に有難うございます!
1

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