データベースのリンクがオープントランザクションのソースであるであると思われます。 PL/SQL Developerのリモート表でSELECT問合せを実行する前に、このような動作に気がつきました。トム・カイト(source)を引用する
:
分散型のものは、 "念のために" トランザクションを開始します。
EDIT: '任意のSQL文は、Oracleでトランザクションを開始'?いいえ、そうではありません。ここでそれを実証しています。このデモでは、アクティブ・トランザクションをリストするデータ・ディクショナリ・ビューV$TRANSACTIONを使用しています。これは、ローカルのOracle XEデータベース上で実行されています。このデータベースには、私以外のユーザーが接続されていません。
このデモンストレーションでは、次の表を使用します。これには単一の列のみが含まれます。
SQL> desc test;
Name Null? Type
----------------------------------------- -------- ----------------------------
A NUMBER(38)
SQL> select count(*) from v$transaction;
COUNT(1)
----------
0
現時点ではアクティブな取引がありません。このテーブルに対してSQLクエリを実行しましょう:
SQL> select * from test;
A
----------
2
SQL> select count(*) from v$transaction;
COUNT(1)
----------
0
アクティブなトランザクションはまだありません。今度はトランザクションを開始する何かをしましょう:
期待どおり、今はアクティブなトランザクションがあります。
SQL> commit;
Commit complete.
SQL> select count(*) from v$transaction;
COUNT(1)
----------
0
トランザクションをコミットした後は、もはやアクティブではありません。
ここで、データベースリンクを作成してみましょう。私は、Oracle XEを使用していますし、次は戻って自分自身に私のOracle XEインスタンスからのデータベース・リンクを作成します。
SQL> create database link loopback_xe connect to user identified by password using 'XE';
Database link created.
は、今の私たちは、データベース・リンクを介してテーブルから選択したときに何が起こるか見てみましょう:
SQL> select count(*) from v$transaction;
COUNT(1)
----------
0
SQL> select * from [email protected]_xe;
A
----------
2
1
SQL> select count(*) from v$transaction;
COUNT(1)
----------
1
ご覧のとおり、リモートテーブルから選択するだけでトランザクションが開きます。
ここにコミットまたはロールバックするものが正確にはわかりませんが、その中にはおそらくその答えがある分散トランザクションの詳細を知りません。
ありがとうございました。オートコミットモードはどのように切り替えられますか? –
私はPL/SQL Developerを使用しないため、わかりません –
@a_horse_with_no_name:すべてのSQL文がトランザクションを開始するとは限りません。私の(更新された)回答のデモンストレーションを見てください。 –