sql >> データベース >  >> RDS >> Oracle

データベースビューから選択するだけでオープントランザクションが発生するのはなぜですか?

    予想に反して、データベースリンクはのようです。 オープントランザクションのソース。 PL / SQL Developerのリモート表でSELECTクエリを実行すると、このような動作に気づきました。

    トム・カイトを引用するには(ソース ):

    編集 :'任意のSQLステートメントがOracleでトランザクションを開始します'?いいえ、そうではありません。これがそのデモンストレーションです。このデモでは、データディクショナリビュー V $TRANSACTION<を使用します。 / a> 、アクティブなトランザクションを一覧表示します。これはすべて、私以外のユーザーが接続していないローカルのOracleXEデータベースで実行されています。

    このデモンストレーションでは、次の表を使用します。含まれる列は1つだけです:

    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> insert into test values (1);
    
    1 row created.
    
    SQL> select count(*) from v$transaction;
    
      COUNT(1)
    ----------
             1
    

    予想どおり、現在アクティブなトランザクションがあります。

    SQL> commit;
    
    Commit complete.
    
    SQL> select count(*) from v$transaction;
    
      COUNT(1)
    ----------
             0
    

    トランザクションをコミットすると、アクティブではなくなります。

    それでは、データベースリンクを作成しましょう。 Oracle XEを使用していますが、以下により、OracleXEインスタンスからそれ自体へのデータベースリンクが作成されます。

    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
    

    ご覧のとおり、リモートテーブルから選択するだけでトランザクションが開きます。

    ここで何をコミットまたはロールバックするかは正確にはわかりませんが、分散トランザクションの詳細がわからないことを認める必要があります。その中にはおそらく答えがあります。



    1. PostgreSQL TypeError:文字列のフォーマット中にすべての引数が変換されるわけではありません

    2. PostgreSQL:デフォルトの制約名

    3. Mysqlの単一スレーブへの複数のマスターレプリケーション

    4. mySQL専用レコード