JDO Query внутри транзакций: да или нет?

Я всегда использовал транзакции при запросе к базе данных, но недавно мне стало интересно, почему.

Каковы преимущества/недостатки использования/неиспользования транзакций в запросе «только для чтения»?

Транзакционный:

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 позволяет контролировать, блокируются ли объекты, обнаруженные запросом, во время этой транзакции, чтобы другие транзакции не могли их обновить в это время: 1 /jdo/jdoql.html" rel="nofollow">http://www.datanucleus.org/products/accessplatform

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();
    }
}
1/jdo/jdoql.html


person marcolopes    schedule 07.06.2014    source источник
comment
Почему реализация JDO по умолчанию блокирует все объекты? Это было бы рецептом взаимоблокировок. Из того, что я вижу, JDO позволяет вам блокировать отдельные запросы (запрос или поиск), что и имеет смысл.   -  person Neil Stockton    schedule 09.06.2014
comment
Да, я согласен! Но вы не ответили на мой вопрос: какая польза от такой дефолтной транзакции?   -  person marcolopes    schedule 09.06.2014
comment
зачем мне отвечать на ваш вопрос, если я оставлю комментарий? Ответы идут ниже. Кроме того, ответ также отвечает, что: транзакции обеспечивают изоляцию, поэтому в зависимости от уровня изоляции запрос не видит, что меняется в других потоках.   -  person Neil Stockton    schedule 09.06.2014
comment
Меня смущает тот факт, что я могу определить глобальный уровень транзакции (чтение-неподтвержденное | чтение-фиксация | повторяемое-чтение | сериализуемое), но затем я также могу указать свойства, такие как transaction.serializeReadObjects для каждой транзакции. Меня также смущают глобальные свойства, такие как datanucleus.rdbms.query.useUpdateLock — разве это не то же самое, что определение уровня глобальной транзакции как сериализуемого? (я понимаю, что это специфические свойства DN, но, тем не менее, связанные с JDO)   -  person marcolopes    schedule 10.06.2014
comment
Этот вопрос проливает свет на эту тему: другой уровень изоляции в транзакции базы данных"> stackoverflow.com/questions/7421314/   -  person marcolopes    schedule 10.06.2014


Ответы (1)


Это зависит. Если у вас есть только атомарное чтение, они, вероятно, не нужны.

Однако, если вы хотите прочитать более одного значения, возможно, из разных таблиц, возможно, выбор зависит от результата первого запроса, вам могут помочь транзакции: Вы можете не захотеть, чтобы база данных изменялась во время выполнения чтения -only query. Транзакции могут обеспечивать изоляцию, например гарантировать, что данные не изменятся во время транзакции.

Также упомянем недостатки: транзакции — это удар по производительности.

person Fabian    schedule 07.06.2014
comment
Что меня озадачивает, так это, например, реализация Datanucleus JDO. если транзакции не блокируют объекты по умолчанию, какая польза от такой транзакции? (ПРИМЕЧАНИЕ: см. отредактированный вопрос) - person marcolopes; 09.06.2014
comment
Как уже упоминалось в комментариях выше: блокировать все по умолчанию — в большинстве случаев плохая идея. Я не знаю Datanucleus и не могу вам подробно рассказать, как там блокировать объекты. Если вы не заботитесь об изменении данных, я думаю, что транзакции не нужны. Однако в этом случае накладные расходы должны быть довольно небольшими. - person Fabian; 10.06.2014