内部事务中的JDO查询:是或否?

时间:2014-06-07 18:11:26

标签: java transactions jdo datanucleus jdoql

我在查询数据库时总是使用事务,但最近我想知道为什么。

在“只读”查询中使用/不使用事务有什么好处/缺点?

事务:

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

1 个答案:

答案 0 :(得分:2)

这取决于。如果您只有原子读数,则可能不需要它们。

但是,如果要读取多个值(可能来自不同的表),可能选择取决于第一个查询的结果,事务可能会帮助您: 您可能不希望在执行只读查询时数据库发生更改。 事务可以提供隔离,例如保证数据在事务期间不会发生变化。

还提到了一些缺点:交易是一种性能损失。