2010-02-02 62 views
3

在GAE上使用JDO,我使用了一個簡單的數據庫事務代碼塊,如下所示。如何從java.sql.SQLException重試/恢復:併發修改

什麼是從拋出的java.sql.SQLException中重試/恢復的好方法:併發修改?

private final Provider pmp; ...

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

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

pm.currentTransaction()。commit();

}最後{

如果(pm.currentTransaction()isActive()。){ log.severe(this.getClass()的getName()+ 「捕獲數據庫異常。」); pm.currentTransaction()。rollback(); } }

回答

0

該異常實際拋出的位置在哪裏?你確定commit()和isActive()的語義嗎? commit()可以自動創建一個新事務,使事務始終處於活動狀態。

我的另一個猜測是,這是一個單一的bean併發訪問,它們都在同一個事務中與其他查詢同時修改你請求的對象。

+0

感謝您建議仔細查看語義。 仔細觀察棧跟蹤和javadoc。 從commit()拋出異常,java.sql.exception嵌套在JDOCanRetryException的子類javax.jdo.JDODataStoreException中 http://db.apache.org/jdo/api23/apidocs/ javax/jdo/JDODataStoreException.html 現在是否有辦法捕獲此異常並重試該操作而不將所有變量導出到單個參數塊中? – Stevko 2010-02-03 00:00:53

+0

我仍然覺得這個異常不應該拋出。您的序列化級別是否設置正確?你不能嘗試提交,直到currentTransaction()。isActive()? – sibidiba 2010-02-07 17:17:59