- - PR -
Transactionのオブジェクトが失われます。
1
投稿者 | 投稿内容 | ||||||||
---|---|---|---|---|---|---|---|---|---|
|
投稿日時: 2005-06-20 16:52
はじめまして。
Oracke10gでOLEDBのトランザクションでコミットを行うとオブジェクトが失われてしまいます。 この状態のままでコミットを行うと以下のエラーメッセージが得られました。 Message:この OleDbTransaction は完了しています。再度使用することはできません。 Source :System.Data Type :System.InvalidOperationException HResult:-2146233079 「NULLだったら再取得」のコードを入れましたが、 m_oledbtransaction->Commit(); if(m_oledbtransaction ==NULL) { m_oledbtransaction = m_oledbconnection->BeginTransaction(); } と、if文を介すると、オブジェクトが得られませんでした。 if文を介さず、直ぐに行うとオブジェクトを得る事が出来ました。 m_oledbtransaction->Commit(); m_oledbtransaction = m_oledbconnection->BeginTransaction(); 以上の状態なのですが、調べた限りでは何が間違っているのか判りませんでした。 どうか、ご助言をお願いします。 | ||||||||
|
投稿日時: 2005-06-20 17:22
こんにちは、じゃんぬ です。
この Message 通りですよ。
もしかしたら私の読み間違いかもしれませんけど。 トランザクションに関する考えに誤りがあるのかもしれません。 _________________ C# と VB.NET の入門サイト じゃんぬねっと日誌 | ||||||||
|
投稿日時: 2005-06-20 17:39
この時、本当にoledbtransactionはNULLなのですか? もしNULLになっているならば、転載時に省略している処理に原因があるのでしょう。 | ||||||||
|
投稿日時: 2005-06-20 19:25
ご助言下さり、ありがとうございます。
10gに関わってまだ半月ばかり、まだ判らない事が多いもので、 知識不足による駄文愚問はご容赦下さい。 じゃんぬねっとさん >トランザクションに関する考えに誤りがあるのかもしれません。 それは、もしかして、トランザクションのBegin()で、 コマンドに、入れ子のトランザクションを充てるという事でしょうか? 甕星さん(むう、読めない(汗)。辞書にも掛からなかったし。) >この時、本当にoledbtransactionはNULLなのですか? NULL判定では、引っかかるので、多分NULLです。ウォッチ式だけでは、判然としませんでした。 ただ、内部メンバは、全部未定義扱いになっています。 トランザクション生成からの関連コードといえば、 生成時:m_oledbtransaction = m_oledbconnection->BeginTransaction(); コマンド実行時:m_oledbcommand->Transaction = m_oledbtransaction; (複数回)・・・コマンド実行時:m_oledbcommand->Transaction = m_oledbtransaction; コミット時:oledbtransaction->Commit(); Dispose時:oledbtransaction->Dispose(); 今、確認してみましたが、関連するコードは、以上の4種類だけでした。 Dispose()は関係ありませんが。 隣の席の人の見解では、ガベッジコレクトが、勝手に開放しているのではないかと、 いう事でしたが、果たして、そのようなケースがあるのでしょうか? 有効レンジでの実行の最中だから、無いだろうと理解していますが、 認識が間違っているならば、どうかご指摘下さい。 それとも、1コミット1トランザクションという事なのでしょうか? | ||||||||
|
投稿日時: 2005-06-20 22:54
NULLと、破棄済みは違いますから。
そんなことはありません。
そういうことです。コミットしたら、トランザクションは終了します。新しいトランザクションを開始してください。 SQL*PLUSでは、コミット、ロールバックしたら、即時、新しいトランザクションが始まります。 _________________ | ||||||||
|
投稿日時: 2005-06-20 23:24
太字のところを通っていないのでは? if文の意図は? if文が無いと何かまずいことでも? あなたが意図している仕様は、OLEDBTransactionの仕様と合致していますか? | ||||||||
|
投稿日時: 2005-06-21 09:29
こんにちは、じゃんぬ です。
いえ、下記のことが言いたかったのです。
もう答えは出てますね。 ただ、全処理が終わって初めて Commit でないのですか? 次から次へと 1 処理単位でトランザクション処理を入れるのは意図してることですか? _________________ C# と VB.NET の入門サイト じゃんぬねっと日誌 | ||||||||
|
投稿日時: 2005-06-21 11:21
お返事を頂き、ありがとうございます。
Jittaさん >NULLと、破棄済みは違いますから。 確かに、デバッグで追うと、NULLではなく、破棄済みの状態の様でした。 破棄済みという事は、Dispose()を行わなくてもよいのでしょうか? NAL-6295さん NULLではなかった為、ifブロックには入っていませんでした。 NULL判定によって、オブジェクトが消失しているか判断しようとしていました。 >OLEDBTransactionの仕様と合致していますか? 知識不足ですみません。オブジェクトがコミットで破棄される事を知りませんでした。 じゃんぬねっとさん > 1 処理単位でトランザクション処理を入れるのは意図してることですか? ええ、そうです。サーバが落ちた時に直前の処理まで反映されていないと 都合が悪いという事情で、一々コミットを行わなければならないので。 |
1