如何重试/恢复java.sql.SQLexception: Concurrent Modification异常

3

在GAE上使用JDO时,我正在使用以下简单的数据库事务代码块。

如何很好地重试/恢复抛出的java.sql.SQLException: Concurrent Modification?

private final Provider pmp; ...

PersistenceManager pm = pmp.get(); try { pm.currentTransaction().begin();

MyObject myObject= pm.getObjectById(MyObject.class, id);

pm.currentTransaction().commit();

} finally {

如果(pm.currentTransaction().isActive()) { log.severe( this.getClass().getName() + " 捕获到数据库异常。"); pm.currentTransaction().rollback(); } }

1个回答

0

这个异常实际上是在哪里抛出的?你确定 commit() 和 isActive() 的语义吗?commit() 可能会自动创建一个新的事务,使事务始终处于活动状态。

我的另一个猜测是,这是一个单例 bean,在并发访问时,它们都进入相同的事务,与同时修改您请求的对象的其他查询一起。


感谢您建议更仔细地查看语义。更仔细地查看堆栈跟踪和javadoc文档。 异常是从commit()中抛出的,而java.sql.exception嵌套在javax.jdo.JDODataStoreException中,后者是JDOCanRetryException的子类。http://db.apache.org/jdo/api23/apidocs/javax/jdo/JDODataStoreException.html现在有没有一种方法可以捕获此异常并重试操作,而不必将所有变量导出到单个参数块中? - Stevko
我仍然觉得不应该抛出这个异常。你的序列化级别设置正确吗?在currentTransaction().isActive()之前,你不能尝试提交吗? - sibidiba

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接