【问题标题】:JDO Query inside transactions: yes or no?JDO 查询内部事务:是还是否?
【发布时间】:2014-06-07 18:11:26
【问题描述】:

查询数据库时一直使用事务,但最近想知道为什么。

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

事务性:

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

【问题讨论】:

  • 为什么 JDO 实现会默认锁定所有对象?那将是陷入僵局的秘诀。在我看来,JDO 允许您锁定单个请求(查询或查找),这是有道理的。
  • 是的,我同意!但是你没有回答我的问题:这种“默认”交易有什么好处?
  • 如果我发表评论,我为什么要回答你的问题?答案在下面。除了答案之外,还回答了:事务提供隔离,因此依赖于隔离级别,查询看不到其他线程中发生了什么变化。
  • 我的困惑来自这样一个事实,即我可以定义一个全局事务级别(读未提交 | 读提交 | 可重复读 | 可序列化),但我也可以指定诸如“transaction.serializeReadObjects”之类的属性每笔交易。我也对诸如“datanucleus.rdbms.query.useUpdateLock”之类的全局属性感到困惑——这与将全局事务级别定义为“可序列化”不一样吗? (我知道这些是 DN 特定的属性,但仍然与 JDO 相关)
  • 这个问题说明了这个问题:stackoverflow.com/questions/7421314/…

标签: java transactions jdo datanucleus jdoql


【解决方案1】:

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

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

还要提一下缺点:事务会影响性能。

【讨论】:

  • 令我困惑的是,例如,Datanucleus JDO 的实现。如果事务默认不锁定对象,那么这样的事务有什么好处? (注意:请参阅已编辑的问题)
  • 正如上面 cmets 中已经提到的:默认情况下锁定所有内容通常是个坏主意。我不知道 Datanucleus,也不能告诉你如何在那里锁定对象的细节。如果您不关心更改数据,我认为不需要交易。不过,在这种情况下,开销应该很小。
猜你喜欢
  • 2018-12-10
  • 1970-01-01
  • 1970-01-01
  • 2017-02-16
  • 2011-06-22
  • 2018-12-12
  • 1970-01-01
  • 1970-01-01
  • 2011-06-05
相关资源
最近更新 更多