- PR -

ORACLEの一時テーブルのトランザクション

1
投稿者投稿内容
GENZO
大ベテラン
会議室デビュー日: 2003/11/26
投稿数: 111
お住まい・勤務地: 名古屋
投稿日時: 2007-10-09 19:46
ORACLEの一時テーブルについて調査しています。

以下のようなテーブルに一時データを作成し、一連のトランザクション
でデータを参照しようとしています。

CREATE GLOBAL TEMPORARY TABLE TEST_TEMP (
TEST_CODE CHAR(4) NOT NULL,
TEST_SNAME VARCHAR2(256),
CONSTRAINT PK_TEST_TEMP PRIMARY KEY(TEST_CODE)
USING INDEX
)
ON COMMIT DELETE ROWS

現状、以下のように処理しています。
 1.System.Transactions.TransactionScope()にてトランザクションをかける
 2.一時テーブルにINSRT
 3.一時テーブルのSELECT

「2」の時点で処理件数を確認すると、INSERTした件数の
カウントが取れます。ところが「3」の時点で、件数が0
件になってしまいます。

そこで、調査のため、System.Transactions.TransactionScope()を
使用せず、OracleConnection.BeginTransaction()でトランザクションを
かけると、「3」の時点で、データが取得できます。

この違いについて何かご存知ないでしょうか?

環境は以下のとおりです。
 ・ORACLE 10g
 ・ODP.NET 10.2.0.2.21
 ・VS.NET2005
 ・WindowsXP SP2


[ メッセージ編集済み 編集者: GENZO 編集日時 2007-10-09 20:11 ]
Anthyhime
ぬし
会議室デビュー日: 2002/09/10
投稿数: 437
投稿日時: 2007-10-09 21:09
System.Transactions.TransactionScope()によるトランザクションはMSDTCを利用したランザクションサービスでOracleの.netクライアントは対応していないかもしれません。
OracleConnection.BeginTransactionで開始されるトランザクションは通常のデータベーストランザクションなので問題なく動作するのではないでしょうか。
GENZO
大ベテラン
会議室デビュー日: 2003/11/26
投稿数: 111
お住まい・勤務地: 名古屋
投稿日時: 2007-10-10 12:08
ご見解ありがとうございます。>Anthyhime様

もうひとつの一時テーブルの方式として、
 ON COMMIT PRESERVE ROWS
があります。この方式で実験してみたところ、System.Transactionsを使っても想定どおりの動作をしました。
仕様的にこちらでも問題がなさそうなので、こちらを採用することにしました。

引用:

Anthyhimeさんの書き込み (2007-10-09 21:09) より:
System.Transactions.TransactionScope()によるトランザクションはMSDTCを利用したランザクションサービスでOracleの.netクライアントは対応していないかもしれません。
OracleConnection.BeginTransactionで開始されるトランザクションは通常のデータベーストランザクションなので問題なく動作するのではないでしょうか。



MSDTCを使った分散トランザクションならではの何かがあるっぽいですね。
今後の調査で何か発見しましたら、情報開示します。
1

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