- PR -

内部結合をするSQLを一つのコネクション内で複数投げると値がおかしい。

1
投稿者投稿内容
Tatsuya
ベテラン
会議室デビュー日: 2007/04/02
投稿数: 53
投稿日時: 2007-07-12 11:45
DB接続(オートコミットfalse)

無限ループ始

SELECT文発行(内部結合を伴う)
SELECT文の結果を取得

条件1
 UPDATE文発行
 コミットorロールバック処理
条件1

無限ループ終

------------------------------------------------------------

というような処理を作っているのですが、最初のSELECT文が0件で次のループで再びSELECT文で10件取れるはずのところが0件のままだったりします。SQLのシンタックスはプロンプトの上で実際に投げて確認しているので、大丈夫だと思われます。

1回目のループ:10件取得 → UPDATE → コミット
2回目のループ:5件取得 → UPDATE → コミット
3回目のループ:10件取得 ここでなぜか5件しか入ってきません。

で、とりあえず、解決策として内部結合を伴うSELECT文の後にコミット処理を行うと正常に処理されるようになりました。

今のところ自分では、内部結合を伴うSELECT文の後にはコミット処理などを行わないといけないのかなということです。あまりSQLに詳しくないので処理はされているけど、合っているのかわからないので、もしわかるかたいたらよろしくお願いします。

[ メッセージ編集済み 編集者: Tatsuya 編集日時 2007-07-12 12:25 ]
tkrn
ベテラン
会議室デビュー日: 2005/10/25
投稿数: 61
投稿日時: 2007-07-12 12:07
引用:

Tatsuyaさんの書き込み (2007-07-12 11:45) より:
DB接続

無限ループ始

SELECT文発行(内部結合を伴う)
SELECT文の結果を取得

UPDATE文発行
コミットorロールバック処理

無限ループ終

------------------------------------------------------------




トランザクションの開始処理がないからとか?
Tatsuya
ベテラン
会議室デビュー日: 2007/04/02
投稿数: 53
投稿日時: 2007-07-12 12:24
tkrnさん

返答ありがとうございます。

コミットなり、ロールバック処理をしていないからと言うことでしょうか?
tkrn
ベテラン
会議室デビュー日: 2005/10/25
投稿数: 61
投稿日時: 2007-07-12 13:14
引用:

Tatsuyaさんの書き込み (2007-07-12 12:24) より:
tkrnさん

返答ありがとうございます。

コミットなり、ロールバック処理をしていないからと言うことでしょうか?



いえ、このフローでループの最後にコミットorロールバック処理が含まれていますが、
ループの最初にトランザクションの開始処理が書かれていなかったので気になりました。
tkrn
ベテラン
会議室デビュー日: 2005/10/25
投稿数: 61
投稿日時: 2007-07-12 13:19
引用:

Tatsuyaさんの書き込み (2007-07-12 11:45) より:
DB接続(オートコミットfalse)

無限ループ始

SELECT文発行(内部結合を伴う)
SELECT文の結果を取得

条件1
 UPDATE文発行
 コミットorロールバック処理
条件1

無限ループ終



いつの間にやら、条件1が追加されてる…

トランザクションの開始処理とコミットorロールバック処理が一対になっているか確認されてみてはどうでしょうか?
おかもと
大ベテラン
会議室デビュー日: 2003/06/08
投稿数: 182
投稿日時: 2007-07-12 22:56
あの、会議室間違いでなければJavaでの話をしてるんですよね?
だとするとJavaのソースを見せてもらわないと皆さん回答しづらいんじゃ
ないでしょうか?提示されている情報がSQLでもJavaでも無いんでは、
SQLが間違っているのか、Javaのコーディングが間違っているのか
検討付かないですよ。
朝日奈ありす
大ベテラン
会議室デビュー日: 2007/05/02
投稿数: 189
お住まい・勤務地: 最北の地
投稿日時: 2007-07-13 07:27
たぶん、O/RMを利用したJAVAかとおもわれる。
1

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