データベースにクエリを実行するときは常にトランザクションを使用していましたが、最近、その理由が気になりました。
「読み取り専用」クエリでトランザクションを使用する/使用しないことの利点/欠点は何ですか?
トランザクション:
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