【发布时间】: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