Java JDO查询内部事务:是还是否?

Java JDO查询内部事务:是还是否?,java,transactions,jdo,datanucleus,jdoql,Java,Transactions,Jdo,Datanucleus,Jdoql,我总是在查询数据库时使用事务,但最近我想知道为什么 在“只读”查询中使用/不使用事务有哪些优点/缺点 事务性: public int count() { PersistenceManager pm=pmf.getPersistenceManager(); JDOTransaction tx=(JDOTransaction)pm.currentTransaction(); try{ tx.begin(); Query query=pm.n

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

在“只读”查询中使用/不使用事务有哪些优点/缺点

事务性:

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();
    }
}
非事务性:

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允许控制查询找到的对象是否在该事务期间被锁定,以便其他事务在此期间无法更新它们:

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

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


还要提到缺点:事务是性能的一大打击。

让我困惑的是,例如,Datanucleus JDO实现。如果事务在默认情况下不锁定对象,那么这种事务的好处是什么?(注意:请参见编辑后的问题)正如上面评论中所提到的:默认情况下锁定所有内容在大多数情况下都是一个坏主意。我不知道Datanucleus,也不能告诉您如何在那里锁定对象的详细信息。如果您不关心更改数据,我认为不需要事务。在这种情况下,开销应该很小。为什么JDO实现默认锁定所有对象?这将导致僵局。据我所见,JDO允许您锁定单个请求(查询或查找),这是有意义的。是的,我同意!但你没有回答我的问题:这种“违约”交易有什么好处?如果我发表评论,我为什么要回答你的问题?答案如下。除此之外,答案还回答:事务提供隔离,因此依赖于隔离级别,查询看不到其他线程中发生了什么变化。我的困惑来自这样一个事实,即我可以定义全局事务级别(读取未提交|读取已提交|可重复读取|可序列化)但是,我还可以为每个事务指定诸如“transaction.serializeReadObjects”之类的属性。我还对全局属性如“datanucleus.rdbms.query.useUpdateLock”感到困惑,这与将全局事务级别定义为“可序列化”不一样吗?(我知道这些是DN特有的属性,但与JDO相关)这个问题说明了这个问题: