C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

Re[1]: UPDATE時の不具合


(過去ログ 59 を表示中)

[トピック内 9 記事 (1 - 9 表示)]  << 0 >>

■34264 / inTopicNo.1)  UPDATE時の不具合
  
□投稿者/ かず (5回)-(2009/03/24(Tue) 22:14:31)

分類:[ASP.NET (C#)] 

ASP.NET(C#) oracle10g 開発です

運用し問題なく動いておりましたが問題点が発見され原因が不明のためご質問致します。

1万件から10万件のデータに対しアップデートをかけます
ボタンA、B、Cがあります。
WHERE句ですが
where lank = A(又はB又はC)
のように常に三パターンになり、イベントによりA、B、Cが判断され実行されます。
UPDATE項目ですが一つのカラムを同一文字列で埋めます。
update TestTable test = 'AAA' where lank = 'A'
の様に変えております。

C#側ですがトランザクションはつけておりません。

問題内容ですが
WHEREでlank = 'A'の時に'AAA' に変えておりますが
AAAに変わっていないレコードが当日数件出ておりました。
その後何度か試して出る時がありました。

まとめてWHERE句で変えているので失敗するなら全部失敗するか成功するかになると
思ってますが、そういう場合はあるのでしょうか。
その場合、回避策としてはどうなるのでしょうか

宜しくお願い致します。

懸念点として不具合当日はDBが異様に重たかったことがあります。

引用返信 編集キー/
■34266 / inTopicNo.2)  Re[1]: UPDATE時の不具合
□投稿者/ オショウ (132回)-(2009/03/24(Tue) 22:45:01)
> ASP.NET(C#) oracle10g 開発です
>
> 運用し問題なく動いておりましたが問題点が発見され原因が不明のためご質問致します。
>
> 1万件から10万件のデータに対しアップデートをかけます
> ボタンA、B、Cがあります。

  昔、Oracleで複雑なSQL文を発行した際もモレが出て更新や抽出されない
  場合がありました。オタクルに問い合わせましたが原因不明・・・で、
  結果的に放置されてしまいました。

  回避策としては無いとしか言えませんが、Oracleへの接続は何をご使用
  なのでしょうか。ODP.NET? OleDb?

  接続方法にもバージョン的問題があるかもしれません。

※ 更新対象のデータを、一時的に別のテーブルの抽出して、2回目の抽出
  結果と内容が合致した場合にのみ、一時テーブルの中身を更新し、全て
  更新されているか確認した後に一時テーブルと元テーブル間で再度更新
  処理する・・・みたいな方法で確実性を確保するとか・・・

  時間的コストや容量的コストを無駄にしますが、どこで何件モレが出る
  のか解らない危険性を回避するには仕方がないかと。

※ トランザクションをかけることも一応検討して下さい。
  尚、テーブルの主キー等はどうなっていますか?
  また件数はよいとしてもレコード長の都合もありますので、チューニング
  してみる手もあろうかと。

※ 環境の問題で更新にモレが出る・・・と言うのは考えたくないですネ〜
  それが一番恐ろしい・・・

● オラクルのサポートにも聞いた方がいいと思います。

以上。参考まで・・・
  

引用返信 編集キー/
■34267 / inTopicNo.3)  Re[2]: UPDATE時の不具合
□投稿者/ かず (7回)-(2009/03/24(Tue) 22:52:09)
ご回答有難う御座います

ODP.NETを使用しております。
質問内容で示した動作ですが別機能でいろいろDB操作などしてる時もあります。
例えばレコードにロックがかかる場合があるとか
前後でこういうことをしたら一部反映されない場合があるなど
ありましたら少なからず可能性があればすべて教えていただきたいです。
>尚、テーブルの主キー等はどうなっていますか?
主キーは一カラムに付いております。

最終としてサポートということで
ほか処理に原因があるのか調査がまだ必要なため可能性を教えていただけたら助かります。
引用返信 編集キー/
■34270 / inTopicNo.4)  Re[3]: UPDATE時の不具合
□投稿者/ オショウ (133回)-(2009/03/24(Tue) 23:41:14)
> ODP.NETを使用しております。
> 質問内容で示した動作ですが別機能でいろいろDB操作などしてる時もあります。
> 例えばレコードにロックがかかる場合があるとか
> 前後でこういうことをしたら一部反映されない場合があるなど
> ありましたら少なからず可能性があればすべて教えていただきたいです。

  レコードロックがかかるのであれば、当然な結果だと思います。

  私の過去の遭遇した問題は、他に何も動作していなくて単独で
  あるSQL文を発行したら、1度目と連続2度目の結果が相違
  すると言うものだったので、レコードロック等排他的な状態で
  発生しうる可能性の結果ではありませんでした。

  レコードロック等があっても確実に行いたいのであれば、ロッ
  クのかからないタイミングを作るか、トランザクションかけて
  みて、結果的にモレの有無を確認しないと、1回のみの処理で
  すべて更新させるのは無理かと・・・

> >尚、テーブルの主キー等はどうなっていますか?
> 主キーは一カラムに付いております。

  Where句で選択する対象となるカラムにインデックスが指定さ
  れているか・・・と言うことを聞きたかったのですが・・・

  まぁ〜上記のロックのせいだと思いますので、DBの構造や
  処理の設計を見直さないといけないかと・・・

● 構造的設計的問題だと思いますので、ロックでの排他タイミング
  を考慮しても確実に更新させる方法を検討して下さい。

  SQL ServerよりOracleの方が、その辺は大変かと・・・

以上。
引用返信 編集キー/
■34271 / inTopicNo.5)  Re[4]: UPDATE時の不具合
□投稿者/ かず (8回)-(2009/03/24(Tue) 23:49:33)
ご回答ありがとうございます。

WHERE句で指定するカラムにはインデックスはついてます。

故意的にレコードにロックはかけておりません。
勝手にかかる場合があるなら教えていただきたいのと
かかった場合にアップデートを掛けたならそういった結果になるのかどうか。


引用返信 編集キー/
■34272 / inTopicNo.6)  Re[5]: UPDATE時の不具合
□投稿者/ なちゃ (257回)-(2009/03/25(Wed) 00:42:54)
原因についてはちょっと心当たりはないのですが…

>レコードロックがかかるのであれば、当然な結果だと思います。

>まぁ〜上記のロックのせいだと思いますので、

そんなことはないでしょう。
ロックが解除されるまで待って最終的に全部更新成功するか、
タイムアウトやロールバックセグメント不足もあったかな、全部更新に失敗するかどちらかです。
※1ステートメントでのUpdateなら
中途半端に更新成功することはないはずです。

他の更新処理でlankの値が変わったとかだとタイミングによっておかしく見えることはありえるでしょうけど。

引用返信 編集キー/
■34280 / inTopicNo.7)  Re[1]: UPDATE時の不具合
□投稿者/ はつね (973回)-(2009/03/25(Wed) 09:23:35)
はつね さんの Web サイト
No34264 (かず さん) に返信
> UPDATE項目ですが一つのカラムを同一文字列で埋めます。
> update TestTable test = 'AAA' where lank = 'A'
> の様に変えております。
>
> C#側ですがトランザクションはつけておりません。

複数レコードが更新対象として考えられるならばトランザクションはつけましょう。


> 問題内容ですが
> WHEREでlank = 'A'の時に'AAA' に変えておりますが
> AAAに変わっていないレコードが当日数件出ておりました。

UPDATE TestTable SET test='AAA' WHERE lank='A'
を実行している最中に、lank='A'なレコードがINSERTされたとか?

UpdateTimeみたいなDate型の項目、UpdateTermみたいなVARCHAR2型の項目を
用意してInsert/Update Beforeトリガーで
UpdateTime := SYSDATE;
UpdateTerm := USERENV('TERMINAL')
とかしておくといつどのPCからINSERT/UPDATEしたかで原因切り分けだできる
可能性はあります(このときもトランザクションついてると更に判断しやすく)。

引用返信 編集キー/
■34281 / inTopicNo.8)  Re[4]: UPDATE時の不具合
□投稿者/ はつね (974回)-(2009/03/25(Wed) 09:28:06)
はつね さんの Web サイト
No34270 (オショウ さん) に返信
>>例えばレコードにロックがかかる場合があるとか
>>前後でこういうことをしたら一部反映されない場合があるなど
>>ありましたら少なからず可能性があればすべて教えていただきたいです。
>
>   レコードロックがかかるのであれば、当然な結果だと思います。

当然な結果とはいえないと思います。
デフォルトでは排他解除待ち、NO WAIT指定していれば排他エラーです。
そのエラーを無視するなどの副次的要因が絡めば分かりませんが。


>   SQL ServerよりOracleの方が、その辺は大変かと・・・

最近のバージョンならば大差ないですよ。
昔のSQL Serverだとページ排他とかロックエスカレーションとかあって
よっぽど大変ですが。
# 慣れの問題ではなく機能差としての評価として。


引用返信 編集キー/
■34290 / inTopicNo.9)  Re[5]: UPDATE時の不具合
□投稿者/ オショウ (134回)-(2009/03/25(Wed) 11:22:36)
No34281 (はつね さん) に返信
> 当然な結果とはいえないと思います。
> デフォルトでは排他解除待ち、NO WAIT指定していれば排他エラーです。
> そのエラーを無視するなどの副次的要因が絡めば分かりませんが。
>
> 最近のバージョンならば大差ないですよ。
> 昔のSQL Serverだとページ排他とかロックエスカレーションとかあって
> よっぽど大変ですが。
> # 慣れの問題ではなく機能差としての評価として。

  このカキコを使ってお礼申し上げます。
  ※ オラクルは、守備範囲外なので・・・

以上。
引用返信 編集キー/


トピック内ページ移動 / << 0 >>

このトピックに書きこむ

過去ログには書き込み不可

管理者用

- Child Tree -