0

データベースにクエリを実行するときは常にトランザクションを使用していましたが、最近、その理由が気になりました。

「読み取り専用」クエリでトランザクションを使用する/使用しないことの利点/欠点は何ですか?

トランザクション:

public int count() {

    PersistenceManager pm=pmf.getPersistenceManager();
    JDOTransaction tx=(JDOTransaction)pm.currentTransaction();

    try{
        tx.begin();
        Query query=pm.newQuery(class);
        query.setResult("count(this)");
        Long count=(Long)query.execute();
        query.closeAll();
        tx.commit();

        return count.intValue();

    }finally{
        if (tx.isActive()) tx.rollback();
        pm.close();
    }
}

非トランザクション:

public int count() {

    PersistenceManager pm=pmf.getPersistenceManager();

    try{
        Query query=pm.newQuery(class);
        query.setResult("count(this)");
        Long count=(Long)query.execute();
        query.closeAll();

        return count.intValue();

    }finally{
        pm.close();
    }
}

私を困惑させているのは、例えば Datanucleus JDO の実装です。トランザクションがデフォルトでオブジェクトをロックしない場合、そのようなトランザクションの利点は何ですか?

ドキュメントから: JDOQL を使用すると、クエリで見つかったオブジェクトをそのトランザクション中にロックするかどうかを制御できるため、その間に他のトランザクションがオブジェクトを更新できません: http://www.datanucleus.org/products/accessplatform_2_1/jdo/jdoql. html

4

1 に答える 1

2

場合によります。アトミック読み取りしかない場合は、おそらく必要ありません。

ただし、おそらく異なるテーブルから複数の値を読み取りたい場合、おそらく選択は最初のクエリの結果に依存するため、トランザクションが役立つ場合が あります。読み取り専用クエリの実行中にデータベースが変更されることを望まない場合があります。 . トランザクションは、トランザクション中にデータが変更されないことを保証するなど、分離を提供できます。

欠点についても言及します。トランザクションはパフォーマンス ヒットです。

于 2014-06-07T18:43:13.063 に答える