【问题标题】:how to retry/recover from a java.sql.SQLexception: Concurrent Modification如何从 java.sql.SQLexception 重试/恢复:并发修改
【发布时间】:2011-01-12 08:48:31
【问题描述】:

在 GAE 上使用 JDO,我正在使用一个简单的数据库事务代码块,如下所示。

什么是从抛出的 java.sql.SQLException 重试/恢复的好方法:并发修改?

private final Provider pmp; ...

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

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

pm.currentTransaction().commit();

} 最后{

if (pm.currentTransaction().isActive()) { log.severe(this.getClass().getName() + " 捕获 DATABASE 异常。"); pm.currentTransaction().rollback(); } }

【问题讨论】:

    标签: java google-app-engine jdo google-cloud-datastore


    【解决方案1】:

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

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

    【讨论】:

    • 感谢您建议更仔细地研究语义。更仔细地查看堆栈跟踪和 javadocs。异常是从 commit() 抛出的,java.sql.exception 嵌套在 javax.jdo.JDODataStoreException 中,它是 JDOCanRetryException db.apache.org/jdo/api23/apidocs/javax/jdo/… 的子类现在有办法捕获这个异常并重试操作而不导出所有变量放到一个参数块中?
    • 我还是觉得这个异常不应该抛出。您的序列化级别设置正确吗?你不能在 currentTransaction().isActive() 之前尝试提交吗?
    猜你喜欢
    • 1970-01-01
    • 2016-01-11
    • 1970-01-01
    • 2014-03-24
    • 1970-01-01
    • 2019-09-26
    • 1970-01-01
    • 1970-01-01
    • 2015-09-06
    相关资源
    最近更新 更多