Я всегда использовал транзакции при запросе к базе данных, но недавно мне стало интересно, почему.
Каковы преимущества/недостатки использования/неиспользования транзакций в запросе «только для чтения»?
Транзакционный:
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
1/jdo/jdoql.htmlpublic 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();
}
}