@IT会議室は、ITエンジニアに特化した質問・回答コミュニティ「QA@IT」に生まれ変わりました。ぜひご利用ください。
- PR -

Transactionのオブジェクトが失われます。

1
投稿者投稿内容
雑賀党
会議室デビュー日: 2005/06/20
投稿数: 7
投稿日時: 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();

以上の状態なのですが、調べた限りでは何が間違っているのか判りませんでした。
どうか、ご助言をお願いします。
じゃんぬねっと
ぬし
会議室デビュー日: 2004/12/22
投稿数: 7811
お住まい・勤務地: 愛知県名古屋市
投稿日時: 2005-06-20 17:22
こんにちは、じゃんぬ です。

引用:

Message:この OleDbTransaction は完了しています。再度使用することはできません。


この Message 通りですよ。

引用:

以上の状態なのですが、調べた限りでは何が間違っているのか判りませんでした。


もしかしたら私の読み間違いかもしれませんけど。
トランザクションに関する考えに誤りがあるのかもしれません。



_________________
C# と VB.NET の入門サイト
じゃんぬねっと日誌
甕星
ぬし
会議室デビュー日: 2003/03/07
投稿数: 1185
お住まい・勤務地: 湖の見える丘の上
投稿日時: 2005-06-20 17:39
引用:

雑賀党さんの書き込み (2005-06-20 16:52) より:
if(m_oledbtransaction ==NULL)


この時、本当にoledbtransactionはNULLなのですか?
もしNULLになっているならば、転載時に省略している処理に原因があるのでしょう。
雑賀党
会議室デビュー日: 2005/06/20
投稿数: 7
投稿日時: 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トランザクションという事なのでしょうか?
Jitta
ぬし
会議室デビュー日: 2002/07/05
投稿数: 6267
お住まい・勤務地: 兵庫県・海手
投稿日時: 2005-06-20 22:54
 NULLと、破棄済みは違いますから。


引用:

 隣の席の人の見解では、ガベッジコレクトが、勝手に開放しているのではないかと、
いう事でしたが、果たして、そのようなケースがあるのでしょうか?


そんなことはありません。

引用:

 それとも、1コミット1トランザクションという事なのでしょうか?


そういうことです。コミットしたら、トランザクションは終了します。新しいトランザクションを開始してください。
 SQL*PLUSでは、コミット、ロールバックしたら、即時、新しいトランザクションが始まります。
_________________
NAL-6295
ぬし
会議室デビュー日: 2003/01/26
投稿数: 966
お住まい・勤務地: 東京
投稿日時: 2005-06-20 23:24
引用:

雑賀党さんの書き込み (2005-06-20 16:52) より:
m_oledbtransaction->Commit();
if(m_oledbtransaction ==NULL)
{
m_oledbtransaction = m_oledbconnection->BeginTransaction();
}



太字のところを通っていないのでは?
if文の意図は?
if文が無いと何かまずいことでも?
あなたが意図している仕様は、OLEDBTransactionの仕様と合致していますか?
じゃんぬねっと
ぬし
会議室デビュー日: 2004/12/22
投稿数: 7811
お住まい・勤務地: 愛知県名古屋市
投稿日時: 2005-06-21 09:29
こんにちは、じゃんぬ です。

引用:

それは、もしかして、トランザクションのBegin()で、
コマンドに、入れ子のトランザクションを充てるという事でしょうか?


いえ、下記のことが言いたかったのです。

引用:

それとも、1コミット1トランザクションという事なのでしょうか?


もう答えは出てますね。
ただ、全処理が終わって初めて Commit でないのですか?
次から次へと 1 処理単位でトランザクション処理を入れるのは意図してることですか?



_________________
C# と VB.NET の入門サイト
じゃんぬねっと日誌
雑賀党
会議室デビュー日: 2005/06/20
投稿数: 7
投稿日時: 2005-06-21 11:21
お返事を頂き、ありがとうございます。

Jittaさん
>NULLと、破棄済みは違いますから。
確かに、デバッグで追うと、NULLではなく、破棄済みの状態の様でした。
破棄済みという事は、Dispose()を行わなくてもよいのでしょうか?

NAL-6295さん
 NULLではなかった為、ifブロックには入っていませんでした。
NULL判定によって、オブジェクトが消失しているか判断しようとしていました。
>OLEDBTransactionの仕様と合致していますか?
 知識不足ですみません。オブジェクトがコミットで破棄される事を知りませんでした。

じゃんぬねっとさん
> 1 処理単位でトランザクション処理を入れるのは意図してることですか?
 ええ、そうです。サーバが落ちた時に直前の処理まで反映されていないと
都合が悪いという事情で、一々コミットを行わなければならないので。
1

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