予想に反して、データベース リンクがオープン トランザクションのソースのようです。PL/SQL Developer でリモート テーブルに対して SELECT クエリを実行しているときに、このような動作に気付きました。
Tom Kyte を引用するには ( source ):
分散されたものは、「念のため」トランザクションを開始します。
EDIT : 'SQL ステートメントは Oracle でトランザクションを開始します'? いいえ、そうではありません。これがそのデモです。このデモンストレーションでは、アクティブなトランザクションを一覧表示するデータ ディクショナリ ビューV$TRANSACTIONを使用します。これはすべて、私以外のユーザーが接続していないローカルの Oracle XE データベースで実行されています。
このデモでは、次の表を使用します。1 つの列のみが含まれます。
SQL> デスクテスト;
名前ヌル?タイプ
----------------------------------------- -------- - ---------------------------
ナンバー(38)
SQL> v$transaction から count(*) を選択します。
カウント(1)
----------
0
現在アクティブなトランザクションはありません。このテーブルに対して SQL クエリを実行してみましょう。
SQL> select * from test;
あ
----------
2
SQL> v$transaction から count(*) を選択します。
カウント(1)
----------
0
まだアクティブなトランザクションはありません。それでは、トランザクションを開始する何かをしましょう。
SQL> テスト値に挿入 (1);
1 行が作成されました。
SQL> v$transaction から count(*) を選択します。
カウント(1)
----------
1
予想どおり、現在アクティブなトランザクションがあります。
SQL>コミット;
コミット完了。
SQL> v$transaction から count(*) を選択します。
カウント(1)
----------
0
トランザクションをコミットすると、アクティブではなくなります。
それでは、データベース リンクを作成しましょう。私は Oracle XE を使用しています。以下は、Oracle XE インスタンスからそれ自体へのデータベース リンクを作成します。
SQL> データベース リンクを作成する loopback_xe 'XE' を使用して、パスワードで識別されるユーザーに接続します。
データベース リンクが作成されました。
データベース リンクを介してテーブルから選択するとどうなるかを見てみましょう。
SQL> v$transaction から count(*) を選択します。
カウント(1)
----------
0
SQL> select * from test@loopback_xe;
あ
----------
2
1
SQL> v$transaction から count(*) を選択します。
カウント(1)
----------
1
ご覧のとおり、リモート テーブルから選択するだけでトランザクションが開きます。
ここで何をコミットまたはロールバックする必要があるのか 正確にはわかりませんが、分散トランザクションの内外を知らないことを認めなければなりません。おそらくその中に答えがあります。