- - PR -
ORACLEの一時テーブルのトランザクション
1
投稿者 | 投稿内容 | ||||
---|---|---|---|---|---|
|
投稿日時: 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 ] | ||||
|
投稿日時: 2007-10-09 21:09
System.Transactions.TransactionScope()によるトランザクションはMSDTCを利用したランザクションサービスでOracleの.netクライアントは対応していないかもしれません。
OracleConnection.BeginTransactionで開始されるトランザクションは通常のデータベーストランザクションなので問題なく動作するのではないでしょうか。 | ||||
|
投稿日時: 2007-10-10 12:08
ご見解ありがとうございます。>Anthyhime様
もうひとつの一時テーブルの方式として、 ON COMMIT PRESERVE ROWS があります。この方式で実験してみたところ、System.Transactionsを使っても想定どおりの動作をしました。 仕様的にこちらでも問題がなさそうなので、こちらを採用することにしました。
MSDTCを使った分散トランザクションならではの何かがあるっぽいですね。 今後の調査で何か発見しましたら、情報開示します。 |
1